Android中如何实现放大与缩小手势
今天小编给大家分享一下Android中如何实现放大与缩小手势的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
站在用户的角度思考问题,与客户深入沟通,找到开封网站设计与开封网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站制作、成都网站制作、企业官网、英文网站、手机端网站、网站推广、域名注册、虚拟空间、企业邮箱。业务覆盖开封地区。
放大与缩小手势(1)
放大与缩小手势对应TransformGestureEvent. GESTURE_ZOOM事件类型,使用时要求两个手指触摸屏幕,同时向外或向内做放缩动作。
放缩手势操作起来简单且直观,在触摸屏设备上的应用范围很广,比如浏览网页时控制页面上的字体大小,查看地图时控制地图的缩放级别等。
下面的实例程序GestureZoom演示了如何使用ZOOM手势来控制图片的放缩。对loader对象添加手势监听器,事件响应函数根据手势动作,实现放大或缩小加载的图片。主程序Main.as的代码如下:
package { import flash.display.Loader; import flash.display.Sprite; import flash.events.Event; import flash.events.TransformGestureEvent; import flash.geom.Point; import flash.net.URLRequest; public class Main extends AppBase { private var loader:Loader; override protected function init():void { //使用Loader对象加载图片 loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete); addChild(loader); //加载目录下的图片 loader.load( new URLRequest("dog.jpg") ); } //处理加载事件 private function onLoadComplete(e:Event):void { loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onLoadComplete); //判断设备是否支持手势事件 if ( Multitouch.supportsGestureEvents ) { //对loader对象添加手势事件监听器 loader.addEventListener(TransformGestureEvent.GESTURE_ZOOM, onZoom); } } //响应放缩手势 private function onZoom(e:TransformGestureEvent):void { //记录下手势作用点的位置,采用loader对象中的本地坐标 var p:Point = new Point( e.localX, e.localY ); //将坐标转换为父级容器的本地坐标 var parent_p:Point = this.globalToLocal(loader.localToGlobal(p)); //对loader对象做放缩处理 loader.scaleX *= e.scaleX; loader.scaleY *= e.scaleY; //loader对象缩放后,p点在loader对象中的坐标没有变,但在父级容器中的坐标已发生变化,因此要//重新计算 var parent_p2:Point = this.globalToLocal(loader.localToGlobal(p)); //移动loader,使得点p在父级容器的坐标保持不变 loader.x += (parent_p.x - parent_p2.x); loader.y += (parent_p.y - parent_p2.y); } }
在本例中,使用Loader对象加载程序目录下的图片。加载完成后,对loader对象添加手势事件监听器,代码如下:
if ( Multitouch.supportsGestureEvents )
{
loader.addEventListener(TransformGestureEvent.GESTURE_ZOOM, onZoom);
}
放大与缩小手势(2)
由于Multitouch类的inputMode属性默认为处理手势事件,因此无需更改交互模式即可处理手势事件。使用手势事件之前,对Multitouch类的supportsGestureEvents属性做判断是一个好习惯。事实上,仅仅做这一个判断并不能确保设备就一定会支持所有的手势。要做到万无一失,还需要检查Multitouch的supportedGestures属性,检查的过程如下:
var index:int = -1; if ( Multitouch.supportedGestures != null ) { index = Multitouch.supportedGestures.indexOf(TransformGestureEvent.GESTURE_ZOOM); } if(Multitouch.supportsGestureEvents && index != -1 ) { //添加其他代码 }
supportedGestures是一个Vector类型的数组,包含了设备支持的所有手势类型。每个元素代表一个事件类型,如果设备任何一个手势都不支持,supportedGestures的值为null。因此,要检测设备是否支持某个手势,可以使用Vector的indexOf方法进行查找,确保代码在设备上能够正确运行。
处理GESTURE_ZOOM 事件时,使用TransformGestureEvent 对象的scaleX与scaleY,即可分别获取水平方向与垂直方向的缩放值。如果手指向外滑动,表示放大,对应的scaleX与scaleY值大于1,反之小于1。因此,用以下两行代码就可以实现放缩控制:
loader.scaleX *= e.scaleX; 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对象注册点的目的。起决定性作用的两行代码如下:
loader.x += (parent_p.x - parent_p2.x);
loader.y += (parent_p.y - parent_p2.y);
请注意,程序GestureZoom的屏幕朝向设置为横屏模式,在程序描述文件中对应的设置项如下:
landscape
以上就是“Android中如何实现放大与缩小手势”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注创新互联行业资讯频道。
分享题目:Android中如何实现放大与缩小手势
浏览地址:http://scyanting.com/article/pdigic.html