`
airfans
  • 浏览: 122392 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[AIR FAQ 2009110201]No default effects with AIR drag and drop

阅读更多

 

典型问题:

当我们在Flex application里用drag and drop时,有一些默认的effects会加给所有的drag and drop操作。比如,如果drag不成功,那么drag proxy files会返回到drag initiator。 但是为什么用同样的代码在AIR 里运行就不会有这些effects。这是因为AIR里,即使指定使用DragManager, drag and drop内部还是会去使用NativeDragManager。
      有什么方法可以在不变换代码的情况下,让run as a AIR application和run as a Flex application有同样的effects呢? 因为我们还要求要支持OS 和AIR app之间的拖拽,所以如果完全强制关掉NativeDragManager 去用DragManager 去做所有的拖拽操作,这也是行不通的?
那么我们应该怎么办呢?

 

解决方案:   

      在AIR app外,drops是无法获得这些effects的。所以我想最简单一种方法是,我们可以做一个假的proxy image  模拟drag 这个动作,当drag不成功的时候,让这个image飞回到我们窗口里开始拖的那个地方。对程序内部的drops来说,我们可以做的更好一点,因为你可以通过 native drag 的event来知道具体的drop 发生在哪里?所以可以重载 Flex drag manager implementation这个类。那么我们是不是也需要重载 Flex SDK的NativeDragManagerImpl 和IDragManager,怎么去做呢?
      如果我们想去重载已经存在的NativeDragManagerImpl,那么我们先需要去preloader里注册它(一旦一个drag manager 被注册后,你就不能再去重载它,所以唯一的去避免默认使用drag manager的办法就是在preloader里先注册,因为它是在你程序initializes之前就运行的)
如下我们做的一个例子,

package hacks
{
     import mx.preloaders.DownloadProgressBar;
     public class Preloader extends mx.preloaders.DownloadProgressBar
     {
           import mx.core.Singleton;
           import mx.core.WindowedApplication;
           import mx.managers.DragManager;
           public function Preloader()
           {
                import hacks.NativeDragManagerImpl;
                var placeholder:NativeDragManagerImpl;
                Singleton.registerClass("mx.managers::IDragManager", hacks.NativeDragManagerImpl);
                DragManager.isDragging;
                super();
           }
      }
}
 


虽然这样可以运行,但是我们建议你最好不要用同一个code去同时run as AIR app和Flex app,尽量避免重载 NativeDragManagerImpl,因为这个class在很多不同的版本里会有轻微的变化,所以如果你这次修改了它,那么当你使用下一个版本的时候,你还需要再做一遍同样的改动,很麻烦。

--米酒

 

分享到:
评论
1 楼 liuyu342 2009-12-07  
学习啦

相关推荐

Global site tag (gtag.js) - Google Analytics