六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 17|回复: 0

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

[复制链接]

升级  28%

24

主题

24

主题

24

主题

秀才

Rank: 2

积分
92
 楼主| 发表于 2013-1-28 19:17:06 | 显示全部楼层 |阅读模式
 
典型问题:
当我们在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在很多不同的版本里会有轻微的变化,所以如果你这次修改了它,那么当你使用下一个版本的时候,你还需要再做一遍同样的改动,很麻烦。

--米酒
 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表