AIR Android:Swipe手势

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

Swipe手势(1)

Swipe手势即单个手指触摸屏幕并快速地朝任意一个方向滑动,一般用来控制页面之间的切换。例如,使用Android自带的相册程序浏览图片时,朝左滑动手指会切换到下一张,朝右滑动则切换到上一张。

本节将创建一个图片浏览器GestureSwipe,使用Swipe手势来切换图片。程序的运行流程如下:

步骤1 创建10个Sprite,用随机颜色进行填充,视为10张图片。

步骤2 开始运行,显示第一张图片。

步骤3 监听Swipe事件,如果是朝右滑动,显示上一张,反之显示下一张。

按照以上流程,首先看第1步,创建图片的代码如下:

 

  1. private function createPages():void  
  2. {  
  3.  for ( var i:uint = 0; i < 10; i++)  
  4.  {  
  5.   pages.push(newPage());  
  6.  }  
  7. }  
  8.  
  9. private function newPage():Sprite  
  10. {  
  11.  var page_width:int = stage.stageWidth-20*2;  
  12.  var page_height:int = stage.stageHeight-20*2;  
  13.    
  14.  var page:Sprite = new Sprite();     
  15.  var g:Graphics = page.graphics;  
  16. //用随机颜色填充矩形  
  17.  var color:uint = 0xFFFFFF*Math.random();  
  18.  g.beginFill(color);  
  19.  g.drawRect(20, 20, page_width, page_height);  
  20.  g.endFill();  
  21.  //默认将图片放在屏幕外  
  22.  page.x = stage.stageWidth;  
  23.  addChild(page);  
  24.    
  25.  return page;  

创建图片用了两个函数:createPages和newPage,其中newPage负责创建单张图片。图片默认被放置于屏幕外,并存放在数组pages中。之所以使用数组,主要为了便于切换图片。程序中使用参数currentIndex保存当前图片的索引,每次切换图片时,只需改变currentIndex的值即可。

第2步,开始运行后默认要显示第一张图片,也就是要将currentIndex的值修改为1。这相当于执行了“下一张”的操作,和向左滑动手势的效果是一样的。为此,将处理图片切换的相关功能独立成一个函数movePage,代码如下:

  1. //参数direction表示方向,1表示下一张,-1表示上一张  
  2. private function movePage( direction:int = 1 ):void  
  3. {  
  4.         var newIndex:int;  
  5.         if ( direction == -1 )  
  6.         {  
  7.   //上一张,当前索引减1,如果已经到达第一张,就不能再向前了  
  8.                 newIndex = currentIndex - 1;  
  9.                 if ( newIndex < 0 )  
  10.                 {  
  11.                         newIndex = 0;  
  12.                 }  
  13.         }  
  14.         else  
  15.         {  
  16.                 //下一张,索引加1,如果到了最后一张,就不能再向后了  
  17.                 newIndex = currentIndex + 1;   
  18.                 if ( newIndex >= (pages.length-1) )  
  19.                 {  
  20.                         newIndex = pages.length-1;  
  21.                 }  
  22.  
  23.         }  
  24.         //如果和当前页是相同的,表示已经是最前或最后了,保持图片显示不变  
  25.         if ( currentIndex == newIndex ) return;  
  26.         //如果当前显示的图片存在,要将其移开  
  27.         if ( currentIndex >= 0 && currentIndex <= pages.length )  
  28.         {  
  29.                 var oldPage:Sprite = pages[currentIndex];   
  30.  
  31.                 if ( direction == -1 )  
  32.                 {  
  33.                         //显示上一张,当前图片从左向右移,移到屏幕右侧  
  34.                         TweenLite.to(oldPage, 0.5, { x: stage.stageWidth} );  
  35.                 }  
  36.                 else  
  37.                 {  
  38.                         //显示下一张,当前图片从右向左移,移到屏幕左侧  
  39.                         TweenLite.to(oldPage, 0.5, { x: -stage.stageWidth} );  
  40.                 }  
  41.         }  
  42.         //更新currentIndex,获取新的图片,将其移到屏幕显示区域  
  43.         currentIndex = newIndex;  
  44.         var newPage:Sprite = pages[currentIndex];   
  45.         if ( direction == -1 )  
  46.         {  
  47.                 //如果是显示上一张,要从左向右移,所以先将图片位置改到最左边  
  48.                 newPage.x = -stage.stageWidth;  
  49.         }  
  50.         else  
  51.         {  
  52.                 //从右向左移,先将图片位置改到最右边  
  53.                 newPage.x = stage.stageWidth;  
  54.         }  
  55.         //不管是哪个方向,最后都将新的图片移到屏幕显示区域  
  56.         TweenLite.to(newPage, 0.5, { x:0} );      
  57. }

3.3.3 Swipe手势(2)

为了让图片的切换过程更加生动,程序中添加了缓动效果,使用了第三方开源库TweenLite(http://www.greensock.com/tweenlite/)来实现动画。TweenLite的用法很简单,本例中只用了其中的一个方法:

  1. TweenLite.to(newPage, 0.5, { x:0} ); 

to函数的第一个参数为作用对象,第2个参数表示持续时间,第3个参数是要修改的属性。上面这句代码的意思是对newPage对象运用缓动效果,动画持续时间为0.5秒,将newPage的x值从当前值修改为0,实现的效果就是newPage水平移动到舞台原点处。读者可以尝试修改时间参数,体验不同的动画效果。有关TweenLite的用法可以在其站点上找到详细文档。

有了movePage函数,要显示第一张图片,只要加上以下一行代码就可以实现:

  1. movePage(1); 

currentIndex的初始值为–1,执行下一张图片的命令,即切换到第一张图片。

最后是第3步,监听Swipe手势事件。和前两节中处理手势事件的方法完全一样,这里就省略了检测设备信息的过程,先添加如下相关的事件:

  1. stage.addEventListener(TransformGestureEvent.GESTURE_SWIPE, onSwipe); 

以下是响应函数:

  1. private function onSwipe(e:TransformGestureEvent):void  
  2. {  
  3.         if ( e.offsetX == 1 )  
  4.         {  
  5.                 //朝右,对应动作为上一张  
  6.                 movePage(-1);  
  7.         }  
  8.         else  
  9.         {  
  10.                 //否则为下一张  
  11.                 movePage(1);  
  12.         }  

在GESTURE_SWIPE 事件中,TransformGestureEvent对象的offsetX和offsetY分别代表水平和垂直方向的手势朝向。在本例中,只判断水平方向,如果offsetX是1,表示是朝右滑动,反之表示朝左滑动。有了前面的代码铺垫,这里直接调用movePage即可。

移动开发中,Swipe手势配合缓动效果的运用很常见,这种方式充分发挥了触摸屏的技术特点,为程序增色不少。

本例完整的代码位于ch3/ GestureSwipe。

小知识 使用鼠标事件也能够模拟Swipe手势,通过检测鼠标的移动速度就可以实现,在一些Flash游戏中都能看到这类用法。

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

2013-05-14 11:16:26

AIR Android旋转手势

2013-05-14 11:13:02

AIR Android放大缩小手势

2013-05-03 15:17:59

Android开发Android SDK

2011-06-16 10:25:29

AndroidAIR

2013-05-14 09:57:37

2013-05-14 10:39:27

AIR Android打包APK文件

2013-05-14 10:37:10

AIR Android设置访问权限

2013-05-14 10:27:46

Android开发设置程序属性

2013-05-14 10:56:45

AIR Android多点触摸

2013-05-14 10:10:28

Android开发棋子类Grid

2013-05-14 10:05:10

Android开发游戏设计

2013-05-14 09:50:44

Android开发Flash Build

2013-05-14 11:04:58

AIR AndroidTouchEvent类

2013-05-14 11:01:34

AIR AndroidTouchEvent类

2012-03-09 13:26:53

2013-05-14 09:54:27

Android开发开源开发环境

2013-05-14 10:16:35

Android开发主类Main

2013-05-14 10:23:31

Android开发主类Main

2010-08-18 08:21:49

Adobe AIRAndroid

2013-05-14 10:13:52

Android开发主类Main
点赞
收藏

51CTO技术栈公众号