AIR Android:放大与缩小手势

移动开发 Android
处理用户交互,本模块主要介绍了多点触摸相关功能的用法,包括触摸和手势。处理用户交互是AIR Android开发的基础部分,只有设计合理、用户操作符合逻辑的交互,才能增强程序的用户体验。因此,熟练掌握常见的交互手法至关重要。本文为大家介绍放大与缩小手势。

放大与缩小手势(1)

放大与缩小手势对应TransformGestureEvent. GESTURE_ZOOM事件类型,使用时要求两个手指触摸屏幕,同时向外或向内做放缩动作,如图3-2所示。

 
图3-2 放缩手势

放缩手势操作起来简单且直观,在触摸屏设备上的应用范围很广,比如浏览网页时控制页面上的字体大小,查看地图时控制地图的缩放级别等。

下面的实例程序GestureZoom演示了如何使用ZOOM手势来控制图片的放缩。对loader对象添加手势监听器,事件响应函数根据手势动作,实现放大或缩小加载的图片。主程序Main.as的代码如下:

 

  1. package  
  2. {  
  3. import flash.display.Loader;  
  4. import flash.display.Sprite;   
  5. import flash.events.Event;  
  6. import flash.events.TransformGestureEvent;  
  7. import flash.geom.Point;  
  8. import flash.net.URLRequest;  
  9.    
  10. public class Main extends AppBase  
  11. {  
  12. private var loader:Loader;  
  13.    
  14.  override protected function init():void  
  15.  {  
  16.   //使用Loader对象加载图片  
  17.   loader = new Loader();  
  18.   loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);  
  19.   addChild(loader);  
  20.   //加载目录下的图片  
  21.   loader.load( new URLRequest("dog.jpg") );  
  22.  }    
  23.  //处理加载事件  
  24.  private function onLoadComplete(e:Event):void  
  25.  {  
  26.   loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onLoadComplete);  
  27.  //判断设备是否支持手势事件  
  28.  if ( Multitouch.supportsGestureEvents )  
  29.  {  
  30.  //对loader对象添加手势事件监听器  
  31.  loader.addEventListener(TransformGestureEvent.GESTURE_ZOOM, onZoom);  
  32.  }  
  33.  }  
  34.  //响应放缩手势  
  35.  private function onZoom(e:TransformGestureEvent):void  
  36.  {  
  37.   //记录下手势作用点的位置,采用loader对象中的本地坐标  
  38.   var p:Point = new Point( e.localX, e.localY );  
  39.   //将坐标转换为父级容器的本地坐标  
  40.   var parent_p:Point = this.globalToLocal(loader.localToGlobal(p));  
  41.   //对loader对象做放缩处理  
  42.   loader.scaleX *= e.scaleX;  
  43.   loader.scaleY *= e.scaleY;  
  44.   //loader对象缩放后,p点在loader对象中的坐标没有变,但在父级容器中的坐标已发生变化,因此要//重新计算  
  45.   var parent_p2:Point = this.globalToLocal(loader.localToGlobal(p));  
  46.   //移动loader,使得点p在父级容器的坐标保持不变  
  47.   loader.x += (parent_p.x - parent_p2.x);  
  48.   loader.y += (parent_p.y - parent_p2.y);  
  49.  }  

 

在本例中,使用Loader对象加载程序目录下的图片。加载完成后,对loader对象添加手势事件监听器,代码如下:

  1. if ( Multitouch.supportsGestureEvents )  
  2. {  
  3.  loader.addEventListener(TransformGestureEvent.GESTURE_ZOOM, onZoom);  
  4. }

3.3.1 放大与缩小手势(2)

由于Multitouch类的inputMode属性默认为处理手势事件,因此无需更改交互模式即可处理手势事件。使用手势事件之前,对Multitouch类的supportsGestureEvents属性做判断是一个好习惯。事实上,仅仅做这一个判断并不能确保设备就一定会支持所有的手势。要做到万无一失,还需要检查Multitouch的supportedGestures属性,检查的过程如下:

  1. var index:int = -1;  
  2. if ( Multitouch.supportedGestures != null )  
  3. {  
  4. index = Multitouch.supportedGestures.indexOf(TransformGestureEvent.GESTURE_ZOOM);  
  5. }  
  6. if(Multitouch.supportsGestureEvents && index != -1 )  
  7. {  
  8. //添加其他代码  

supportedGestures是一个Vector类型的数组,包含了设备支持的所有手势类型。每个元素代表一个事件类型,如果设备任何一个手势都不支持,supportedGestures的值为null。因此,要检测设备是否支持某个手势,可以使用Vector的indexOf方法进行查找,确保代码在设备上能够正确运行。

处理GESTURE_ZOOM 事件时,使用TransformGestureEvent 对象的scaleX与scaleY,即可分别获取水平方向与垂直方向的缩放值。如果手指向外滑动,表示放大,对应的scaleX与scaleY值大于1,反之小于1。因此,用以下两行代码就可以实现放缩控制:

  1. loader.scaleX *= e.scaleX;  
  2. loader.scaleY *= e.scaleY; 

如果只是简单地对loader对象做放缩处理,会带来一个问题,那就是每次都是以loader的原点为中心点进行缩放。而符合逻辑的做法,应该是以手势动作的作用点为中心进行缩放。也就是说,要将手势动作的作用点设置为loader对象的注册点。虽然ActionScript并没有提供修改可视元件注册点的功能,但可以模拟这个行为。整个过程并不难,关键在于坐标转换,步骤如下:

步骤1 记录手势作用点在loader对象中的本地坐标,记为点p,它将是新的“注册点”。

步骤2 以loader对象的父级容器为参照物,计算出点p在父级容器中的本地坐标,记为点parent_p。

步骤3 对loader对象进行缩放。

步骤4 计算缩放后点p在父级容器中的本地坐标,记为点parent_p2。

步骤5 移动loader对象的坐标,让点p在父级容器中的坐标保持不变。

第5步操作的原理是:点p是loader对象的本地坐标,因此对loader对象进行缩放并不影响点p的值,但点p相对父级容器而言位置发生了变化,所以,根据缩放前后点p在父级容器中的位移,更改loader对象的坐标,就能够让点p在父级容器的坐标保持不变,从而达到了更改loader对象注册点的目的。起决定性作用的两行代码如下:

  1. loader.x += (parent_p.x - parent_p2.x);  
  2. loader.y += (parent_p.y - parent_p2.y);

请注意,程序GestureZoom的屏幕朝向设置为横屏模式,在程序描述文件中对应的设置项如下:

  1. <aspectRatio>landscape</aspectRatio> 

到这里,一个简单的图片放大镜就完工了。

注意 程序中使用的图片放在bin目录中,和其他文件一起被包含在APK文件中,与主SWF文件位于同一目录结构,因此使用相对路径就可以直接加载。

责任编辑:闫佳明 来源: book.51cto.com
相关推荐

2013-05-14 11:18:24

AIR AndroidSwipe手势

2013-05-14 11:16:26

AIR Android旋转手势

2017-05-03 16:36:32

Android图片动画

2013-05-03 15:17:59

Android开发Android SDK

2013-05-14 11:08:23

AIR Android触摸事件鼠标事件

2011-06-16 10:25:29

AndroidAIR

2013-05-14 09:57:37

2013-05-14 10:37:10

AIR Android设置访问权限

2013-05-14 10:27:46

Android开发设置程序属性

2013-05-14 10:39:27

AIR Android打包APK文件

2013-05-14 10:56:45

AIR Android多点触摸

2009-05-30 09:33:10

Palm PreWebOS移动OS

2013-05-14 10:10:28

Android开发棋子类Grid

2013-05-14 10:05:10

Android开发游戏设计

2013-05-14 09:50:44

Android开发Flash Build

2012-03-09 13:26:53

2013-05-14 11:04:58

AIR AndroidTouchEvent类

2013-05-14 11:01:34

AIR AndroidTouchEvent类

2013-05-14 10:16:35

Android开发主类Main

2013-05-14 09:54:27

Android开发开源开发环境
点赞
收藏

51CTO技术栈公众号