About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • Aug

    24

     如果只写 zh_Hans 与 zh_Hant 只能对 iOS 系统起作用,在 Android / 安卓中文系统中它们并不会起作用。安卓需要写 zh-CN 与 zh-TW。注意下划线与减号的区别、以及英文字母大小写的区别。
    <name>
        <text xml:lang="en">默认英文名称</text>
        <text xml:lang="zh_Hans">iOS 简体中文名称</text>
        <text xml:lang="zh_Hant">iOS 繁體中文名稱</text>
        <text xml:lang="zh-CN">Android 简体中文名称</text>
        <text xml:lang="zh-TW">Android 繁體中文名稱</text>
    </name>

    Oct

    7

    AcheGesture 有一个长按手势类 HoldGesture,但它在有些安卓设备中无法使用,这并不是 AcheGesture 的 Bug,也不是 Android 系统的 Bug,造成它无法正常使用的主要原因是因为安卓设备制作商太过杂乱,开发者永远都无法知道一家设备制造商与另一家设备制造商除了分辨率、精度与灵敏度等方面的区别外,还有哪些区别。

    而在 AcheGesture 中造成某些安卓设备无法使用 Hold 手势的主要原因是 Starling 中 Touch 事件的 TouchPhase.MOVED 阶段在不同安卓设备制造商对它的“定义”并不相同,比如在索尼 LT22i 移动定制版手机中,只要按住屏幕,既便没有移动手指,touch.phase 输出的值仍然是 moved 阶段:

    trace(t.phase, t.globalX, t.globalY);
    //output
    moved 80 266
    moved 80 266
    moved 80 266
    moved 80 266
    moved 80 266
    moved 80 266

    而 AcheGesture 中 HoldGesture 通过判断 phase 是否为 TouchPhase.MOVED ,进而是否中止计时器 Timer 对象,所以在这样的设备中,AcheGesture 永远不会发生 Hold/长按屏幕事件。

    虽然造成这种问题的原因与分辨率、精度以及灵敏度等无关,但解决方法基本与《Adobe AIR 移动开发,安卓设备触屏精度不准度的解决方法》一文中相同,通过阔值/容差值进行修正。以下是修正以后的类:

    package acheGesture.gestures
    {
        import flash.events.TimerEvent;
        import flash.geom.Point;
        import flash.utils.Timer;
        import acheGesture.GestureManager;
        import acheGesture.utils.GestureConfigKey;
        import acheGesture.utils.GestureType;
        import starling.events.Touch;
        import starling.events.TouchPhase;

        public class HoldGestureRecognizer extends GestureRecognizerPlugin
        {
            private var _timeThreshold:Number = 1000;
            private var _timer:Timer;
            private var _validate:Boolean;

            private var _touchBeganPoint:Point = new Point(-1,-1);//手指刚开始按下时的点坐标
            private var _touchMovePoint:Point = new Point(-1,-1);//手指开始移动的坐标
            private var _distance:Number = 10;//两个点之间的阔值/容差值

            public function HoldGestureRecognizer(priority:int=0, requireGestureRecognizerToFail:Boolean=false)
            {
                super(GestureType.HOLD, priority, requireGestureRecognizerToFail);
            }

            override public function checkGesture(ts:Vector.<Touch>):Boolean
            {
                var t:Touch = ts[0];

                if(t.phase == TouchPhase.BEGAN)
                {
                    _validate = false;
                    if(_timer == null)
                    {
                        _touchBeganPoint.x = t.globalX;
                        _touchBeganPoint.y = t.globalY;


                        _timer = new Timer(_timeThreshold, 1);
                        _timer.addEventListener(TimerEvent.TIMER, onHoldGestureValidate);
                        _timer.reset();
                        _timer.start();
                    }
                    _failed = false;
                }
                if(t.phase == TouchPhase.MOVED) 
                {
                    _touchMovePoint.x = t.globalX;
                    _touchMovePoint.y = t.globalY;
                    //如果两点之间的距离大于容差值
                    if(Point.distance(_touchBeganPoint,_touchMovePoint) > _distance)
                    {
                        _validate = false;
                        removeTimer();
                        if(!_validate) 
                            _failed = true;
                    }
                }
                if(t.phase == TouchPhase.ENDED) 
                {
                    _validate = false;
                    removeTimer();
                    _touchBeganPoint.x = -1;
                    _touchBeganPoint.y = -1;
                }
                return _validate;
            }

            private function removeTimer():void
            {
                if(_timer)
                {
                    _timer.stop();
                    _timer.removeEventListener(TimerEvent.TIMER, onHoldGestureValidate);
                    _timer = null;
                }
            }

            override public function _onInitGesture(callback:Object, config:Object, g:GestureManager):Boolean
            {
                if(config[GestureConfigKey.TIME_THRESHOLD] != null) 
                    _timeThreshold = Number(config[GestureConfigKey.TIME_THRESHOLD]);
                return super._onInitGesture(callback, config, g);
            }

            private function onHoldGestureValidate(e:TimerEvent):void
            {
                if(_g._firstG.r && !_g.allowSimultaneous) 
                    return;
                removeTimer();
                _validate = true;
                _g.gestureRecognizerStateChange(this._gestureType, true);
            }
        }
    }

    备注:不要试图去为安卓用户开发任何基于精度或灵敏度的 APP(除非 APP 是量身定制量,只在固定的厂商和型号的设备上运行),尤其是应用的用户可能会集中在中低端机型或山寨机型情况下。开发者应珍爱生命,远离安卓开发——把所有的时间和精力放在自己的产品算法和业务逻辑上,不要把时间和精力放在各种安卓厂商生产的不同机型的调试和测试过程中。

    Jan

    17

    实测在苹果公司的 iOS 系统的 iPhone 、iPad 、iPod 等移动设备的中,在对相同的 touchPointID 的多个事件对象进行处理时,当手指轻触屏幕单击的时候 touchBegin,touchEnd 是非常精确的,并不会有任何 touchMove 事件产生。

    在安卓设备生产商太过鱼龙混杂了,会发现很多品牌的手机设备触屏精度并不准确:手指单击屏幕时,往往会产生 touchMove 事件,导致 touchEnd 事件和 touchBegin 事件的 stageX 与 stageY 属性值总是会相差那么一点,好一些的是 0.5 - 3;差一些的低端安卓机在3-7(既便是大生产商也存在这个问题,比如三星、索尼、联想等生产的中低端机,其它小生产厂商更是严重)

    如果需要开发一个精度相当高的应用,那么就不得不使用一些技巧。比如通过一个临时的 Point 变量来保存 touchBegin 的 stageX 与 stageY 的值。然后将 touchEnd 与 touchBegin 事件对象的 stageX 与 stageY 进行比较(可以使用一个精度阈值约为10)后再处理具体的业务逻辑,但这有可能让开发者多写上十几行、甚至几十行代码进行蛋疼的调试和优化。

    精度不准确时不仅会影响到基于精度的 APP 开发,而且还会产生其它问题。比如还会影响到基于速率的 APP开发,一个瞬间的抖动会产生一个较大的瞬间加速度值,甚至是一个逆向的加速度值。所以搞安卓应用和游戏开发者们如果涉及到屏幕精度的开发,那么就不得不极其小心的进行多种设备的测试。

    不得不为 Apple 公司垄断性的生产硬件赞一个。如果每一家公司的硬件都像苹果公司那么优秀,那么开发者会省很多事。苹果的 APP 总是设计的那么高效和优秀,这不仅仅是严格的审核机制和 iOS 系统带来的,跟它的硬件设备也有着非常大的关系。

    Jan

    9

    不同的移动操作系统会施加不同的文件系统限制,而且这些限制通常与由桌面操作系统施加的限制有所不同。因此,平台不同,用于保存文件和数据的适当位置也可能各不相同。文件系统之间存在差异所产生的一个结果是,AIR File 类所提供的常用目录的快捷方式不一定总是可用。下表列出了可在 Android 和 iOS 上使用的权限列表:
      Android iOS
    File.applicationDirectory 通过 URL 只读(非本机路径) 只读
    File.applicationStorageDirectory 可用 可用
    File.cacheDirectory 可用 可用
    File.desktopDirectory SDCard 的根目录 不可用
    File.documentsDirectory SDCard 的根目录 可用
    File.userDirectory SDCard 的根目录 不可用
    File.createTempDirectory() 可用 可用
    File.createTempFile() 可用 可用

    iOS 远程云存储(备份与缓存)相关资料点击这里查看。

    Jun

    27

    这些类列表中,实心圆表示支持,空心圆表示不支持

    Capability AIR for Android iOS Packager
    Accelerometer.isSupported Supported Supported
    Capabilities.hasAccessibility Not Supported Not Supported
    Camera.isSupported Supported Not Supported
    CameraRoll.supportsAddBitmapData Supported Supported
    CameraUI.isSupported Supported Not Supported
    ContextMenu.isSupported Not Supported Not Supported
    DatagramSocket.isSupported Not Supported Not Supported
    DNSResolver.isSupported Not Supported Not Supported
    NativeApplication.supportsDockIcon Not Supported Not Supported
    NativeDragManager.isSupported Not Supported Not Supported
    DRMManager.isSupported Not Supported Not Supported
    EncryptedLocalStore.isSupported Not Supported Not Supported
    Geolocation.isSupported Supported Supported
    HTMLLoader.isSupported Not Supported Not Supported
    IME.isSupported Not Supported Not Supported
    LocalConnection.isSupported Not Supported Not Supported
    Microphone.isSupported Supported Not Supported
    NativeApplication.supportsMenu Not Supported Not Supported
    NativeApplication.supportsDefaultApplication Not Supported Supported
    NativeApplication.supportsStartAtLogin Not Supported Supported
    NativeMenu.isSupported Not Supported Not Supported
    NativeProcess.isSupported Not Supported Supported
    NativeWindow.isSupported Not Supported Not Supported
    NativeWindow.supportsNotification Not Supported Not Supported
    NetworkInfo.isSupported Supported Not Supported
    HTMLLoader.pdfCapability Supported Supported
    PrintJob.isSupported Not Supported Not Supported
    SecureSocket.isSupported Not Supported Not Supported
    ServerSocket.isSupported Not Supported Not Supported
    Stage.supportsOrientationChange Supported Supported
    StorageVolumeInfo.isSupported Not Supported Not Supported
    NativeApplication.nativeApplication.systemIdleMode Supported Supported
    NativeApplication.supportsSystemTrayIcon Not Supported Not Supported
    XMLSignatureValidator.isSupported Not Supported Not Supported
    Updater.isSupported Not Supported Not Supported

    Dec

    23

    Adobe Flash Player for Android

    • 0 Comments
    • Flash Platform

    Android 移动版本 Adobe Flash Player:https://market.android.com/details?id=com.adobe.flashplayer