目录
基本原理
手指按下处理
手指滑移处理
手指离开处理
优化方案
切换为GPU模式
在滑移时降低显示质量
减少渲染区域
尽可能使用位图而非矢量
减少事件侦听
示例
首页 数据库 mysql教程 浅谈Adobe Air滑移及其优化

浅谈Adobe Air滑移及其优化

Jun 07, 2016 pm 04:30 PM
adobe ai air 优化

Adobe Air是Adobe公司用来争夺移动设备应用开发的一个重要武器。移动设备的一个重要体验是手指滑移,但Adobe并没有为Air推出官方滑移的SDK。 所以,若打算用Air来开发移动应用,则会碰到滑移这个问题。以下是对基于Air滑移的一些基本原理及其优化方案的讨论

Adobe Air是Adobe公司用来争夺移动设备应用开发的一个重要武器。移动设备的一个重要体验是手指滑移,但Adobe并没有为Air推出官方滑移的SDK。

所以,若打算用Air来开发移动应用,则会碰到滑移这个问题。以下是对基于Air滑移的一些基本原理及其优化方案的讨论,本文最后会给出一个示例。

基本原理

scroll view

上图说明了滑移的显示列表。

ScrollBg是整个滑移的背景,手指在此进行操作,它是侦听手指滑移事件的目标

ScrollTarget是需要进行滑移的对象,其父为ScrollBg。p1,p2和p3为内部的显示对象。

ScrollMask是滑移对象的mask,用于对滑移对象形成遮罩,其父为ScrollBg。

综上,我们需要在ScrollBg上侦听用户手指事件,对ScrollTarget进行滑移,在滑移时我们只能看到被ScrollMask遮罩的那部分。

    在Adobe Air里,MouseEvent等同于手指触摸的TouchEvent,而只有在需要多点触控时,TouchEvent才有其特有的优势。所以我们侦听MouseEvent即可以侦听用户的手指操作。

  • 手指按下处理

  • 通常情况下,手指按下是整个滑移过程的开始。我们可以侦听MouseDown事件来模拟手指按下。

    在MouseDown侦听器里我们还要添加一系列事件侦听器,来构成整个滑移过程的侦听。

    我们需要知道用户的手指移动,于是需要侦听MouseMove事件。我们还需要知道用户手指的释放,于是需要侦听RollOut和MouseUp事件。此外,我们还可能需要侦听EnterFrame事件,来做一些内部的更新逻辑。

    综上,我们在MouseDown侦听器里处理滑移的开始,并为手指移动,手指释放及每帧更新等事件添加侦听器

  • 手指滑移处理

  • 在MouseMove事件侦听器里,我们需要让滑移对象跟随玩家的手指进行移动。

    所以在添加MouseMove侦听器之前,我们需要事先记录滑移对象当前的位置信息(诸如mouseX,mouseY),并在MouseMove侦听器对滑移对象的位置进行记录,通过两个位置的差异,我们可以计算出滑移对象需要移动的距离。

    若需要移动的距离在合理的范围之内(如:不超过边界值的一半大小),我们将对滑移对象的位置进行改变,并进行更新。

    有时候,我们可能会对滑移对象内的对象添加点击事件,但是我们不希望在滑移释放手指的时候触发这些点击事件。这时候我们可以在MouseMove侦听器里通过计算滑移对象的移动距离,来判断是否应该触发点击事件。

    比如若用户的手指只移动了1-2个像素,用户很可能只是希望点击,而非滑移,所以此时我们不进行处理;但是用户的手指移动了10个以上像素,则我们可以认为用户是在进行滑移操作,此时我们将滑移对象的mouseChildren和mouseEnabled属性禁用,则点击事件则不会在滑移时触发了。

    综上,我们在MouseMove侦听器里记录手指的位置,更新滑移对象的位置以跟随手指移动,做一些特殊处理以避免滑移时让用户触发点击事件

  • 手指离开处理

  • 我们可以将RollOut事件和MouseUp事件视为用户手指离开了滑移触发区域,从而为这两个事件添加一个共同的侦听器MouseLeaveHandler。

    在ios和android的原生滑移里,当用户滑移时手指离开屏幕,系统会对滑移对象进行自动滑移,这类似于物理中的惯性。

    所以我们需要对滑移对象进行一个类似“惯性”的缓动,并在缓动结束的时候,做一些滑移结束的处理。

    同时释放MouseMove和MouseLeaveHandler的侦听,并重新添加MouseDown事件的侦听,来侦听新的滑移。

    综上,我们在MouseLeaveHandler里移除MouseMove和手指移开的事件侦听,并对滑移对象做一个”惯性”的缓动,在缓动结束时,做滑移结束的处理。

优化方案

相对于其他移动开发的引擎,Flash的渲染效率较低,在弱CPU的移动设备上体现尤其明显。

滑移需要移动大块显示区域,可能会造成卡顿和跳帧,所以优化是必须要进行的一项工作。

以下是一些我在实践总结出来的优化方案。

  • 切换为GPU模式

  • 经试验,将大面积滑移从cpu模式切换到gpu模式后,滑移的效率显著的提升了,基本可以达到原生滑移的效果。 只需要修改-app.xml里面的
gpu
登录后复制
GPU模式的优点是处理大块渲染区域移动的效率会显著提升。 缺点是不能使用滤镜,不能使用混合模式,在某些android机型(基本是低端机)上可能会跑不起来。 其中滤镜可以用位图替代,但是可能会带来内存上升的问题。
  • 在滑移时降低显示质量

  • 相对于PC屏幕,移动设备屏幕的ppi值要高很多。这就意味着,当我们在移动设备上降低显示质量时,实际感觉画质效果并没有PC上丢失的那么多。 所以在滑移开始时,我们可以先降低舞台显示质量。

    stage.quality = StageQuality.LOW;
    登录后复制

    等滑移结束时,再恢复舞台显示质量。

    此方案带来的效率提升也是显著的。

    但是会显著的降低显示质量,所以需要在效率和效果方面做取舍。

  • 减少渲染区域

  • 减少渲染区域可以从根本上解决渲染压力的问题。

    实际上,在滑移时,有许多区域都在遮罩区域之外,但这些人眼不可见的区域的位置仍然会被CPU计算,从而浪费CPU周期,降低了效率。

    所以,我们可以在EnterFrame事件里,将在遮罩区域之外的滑移对象的visible设为false。从而避免了它们占用CPU周期。

    以下代码片段说明以上的方法。

    var i:int;
    var numChildren:int = _target.numChildren;
    var child:DisplayObject;
    for(i = 0; i  _bounds.bottom + MAX_VISIBLE_DIST )
    		{
    			child.visible = false;
    		}
    		else
    		{
    			child.visible = true;
    		}
    	}
    	else if( _direct == ScrollDirection.HORIZONTAL || _direct == ScrollDirection.BOTH )
    	{
    		if( child.x + child.width + _target.x  _bounds.right + MAX_VISIBLE_DIST )
    		{
    			child.visible = false;
    		}
    		else
    		{
    			child.visible = true;
    		}
    	}
    }
    登录后复制
  • 尽可能使用位图而非矢量

  • 矢量需要CPU实时进行计算,所以尽可能避免在移动设备上使用矢量,尽可能用位图来替代。
  • 减少事件侦听

  • 事件侦听会消耗帧时间,而且不能恰当的销毁事件侦听会带来恐怖的内存泄露。 所以尽可能减少不必要的事件侦听。 比如在滑移时,将目标的mouse相关属性禁用,等待滑移结束时再启用。

    示例

    示例:http://wuzhiwei.net/opensrc/ScrollAs3/ScrollAs3.html
    源码:https://github.com/iWoz/AirScroll
    本站声明
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    热AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智能驱动的应用程序,用于创建逼真的裸体照片

    AI Clothes Remover

    AI Clothes Remover

    用于从照片中去除衣服的在线人工智能工具。

    Undress AI Tool

    Undress AI Tool

    免费脱衣服图片

    Clothoff.io

    Clothoff.io

    AI脱衣机

    Video Face Swap

    Video Face Swap

    使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

    热工具

    记事本++7.3.1

    记事本++7.3.1

    好用且免费的代码编辑器

    SublimeText3汉化版

    SublimeText3汉化版

    中文版,非常好用

    禅工作室 13.0.1

    禅工作室 13.0.1

    功能强大的PHP集成开发环境

    Dreamweaver CS6

    Dreamweaver CS6

    视觉化网页开发工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神级代码编辑软件(SublimeText3)

    热门话题

    Java教程
    1663
    14
    CakePHP 教程
    1420
    52
    Laravel 教程
    1313
    25
    PHP教程
    1266
    29
    C# 教程
    1239
    24
    全球币圈十大交易所有哪些 排名前十的货币交易平台2025 全球币圈十大交易所有哪些 排名前十的货币交易平台2025 Apr 28, 2025 pm 08:12 PM

    2025年全球十大加密货币交易所包括Binance、OKX、Gate.io、Coinbase、Kraken、Huobi、Bitfinex、KuCoin、Bittrex和Poloniex,均以高交易量和安全性着称。

    比特币值多少美金 比特币值多少美金 Apr 28, 2025 pm 07:42 PM

    比特币的价格在20,000到30,000美元之间。1. 比特币自2009年以来价格波动剧烈,2017年达到近20,000美元,2021年达到近60,000美元。2. 价格受市场需求、供应量、宏观经济环境等因素影响。3. 通过交易所、移动应用和网站可获取实时价格。4. 比特币价格波动性大,受市场情绪和外部因素驱动。5. 与传统金融市场有一定关系,受全球股市、美元强弱等影响。6. 长期趋势看涨,但需谨慎评估风险。

    排名靠前的货币交易平台有哪些 最新虚拟币交易所排名榜前10 排名靠前的货币交易平台有哪些 最新虚拟币交易所排名榜前10 Apr 28, 2025 pm 08:06 PM

    目前排名前十的虚拟币交易所:1.币安,2. OKX,3. Gate.io,4。币库,5。海妖,6。火币全球站,7.拜比特,8.库币,9.比特币,10。比特戳。

    全球币圈十大交易所有哪些 排名前十的货币交易平台最新版 全球币圈十大交易所有哪些 排名前十的货币交易平台最新版 Apr 28, 2025 pm 08:09 PM

    全球十大加密货币交易平台包括Binance、OKX、Gate.io、Coinbase、Kraken、Huobi Global、Bitfinex、Bittrex、KuCoin和Poloniex,均提供多种交易方式和强大的安全措施。

    解密Gate.io战略升级:MeMebox 2.0如何重新定义加密资产管理? 解密Gate.io战略升级:MeMebox 2.0如何重新定义加密资产管理? Apr 28, 2025 pm 03:33 PM

    MeMebox 2.0通过创新架构和性能突破重新定义了加密资产管理。1) 它解决了资产孤岛、收益衰减和安全与便利悖论三大痛点。2) 通过智能资产枢纽、动态风险管理和收益增强引擎,提升了跨链转账速度、平均收益率和安全事件响应速度。3) 为用户提供资产可视化、策略自动化和治理一体化,实现了用户价值重构。4) 通过生态协同和合规化创新,增强了平台的整体效能。5) 未来将推出智能合约保险池、预测市场集成和AI驱动资产配置,继续引领行业发展。

    排名前十的虚拟币交易app有哪 最新数字货币交易所排行榜 排名前十的虚拟币交易app有哪 最新数字货币交易所排行榜 Apr 28, 2025 pm 08:03 PM

    Binance、OKX、gate.io等十大数字货币交易所完善系统、高效多元化交易和严密安全措施严重推崇。

    C  中的chrono库如何使用? C 中的chrono库如何使用? Apr 28, 2025 pm 10:18 PM

    使用C 中的chrono库可以让你更加精确地控制时间和时间间隔,让我们来探讨一下这个库的魅力所在吧。C 的chrono库是标准库的一部分,它提供了一种现代化的方式来处理时间和时间间隔。对于那些曾经饱受time.h和ctime折磨的程序员来说,chrono无疑是一个福音。它不仅提高了代码的可读性和可维护性,还提供了更高的精度和灵活性。让我们从基础开始,chrono库主要包括以下几个关键组件:std::chrono::system_clock:表示系统时钟,用于获取当前时间。std::chron

    怎样在C  中处理高DPI显示? 怎样在C 中处理高DPI显示? Apr 28, 2025 pm 09:57 PM

    在C 中处理高DPI显示可以通过以下步骤实现:1)理解DPI和缩放,使用操作系统API获取DPI信息并调整图形输出;2)处理跨平台兼容性,使用如SDL或Qt的跨平台图形库;3)进行性能优化,通过缓存、硬件加速和动态调整细节级别来提升性能;4)解决常见问题,如模糊文本和界面元素过小,通过正确应用DPI缩放来解决。

    See all articles