Flex4.6【原创】移动设备拖曳、缩放、旋转手势并用(避免冲突)
Flex4.6 移动设备拖曳、缩放、旋转手势并用(避免冲突)
最近工作忙,做移动设备这块,发现flex4.6的源生手势事件没有避免拖曳、缩放、旋转之间的冲突问题,在googlecode找了找,发现这个比较好用且易懂的三方库。
1:定义一个GestureManager管理类的例子:
1 package views
2 {
3 import flash.display.*;
4 import flash.events.Event;
5 import flash.text.*;
6 import flash.events.KeyboardEvent;
7 import flash.ui.Keyboard;
8 import org.tuio.adapters.NativeTuioAdapter;
9 import org.tuio.gestures.*;
10
11 import org.tuio.connectors.*;
12 import org.tuio.*;
13 import org.tuio.debug.*;
14
15 /**
16 * This is a demo class for using the GestureManager.
17 * It uses TuioDebug to visualize the touch points.
18 * A number of randomly colored rectangles will be drawn on the stage.
19 * You can drag, scale, rotate them with the help of the corresponding gestures.
20 * You can use this class either as main class or it to the stage.
21 *
22 * @author Immanuel Bauer
23 */
24 public class GestureManagerExample extends MovieClip {
25
26 public var circleSize:Number;
27 public var tf:TextField;
28
29 private var tDbg:TuioDebug;
30
31 public function GestureManagerExample() {
32 if (stage) init();
33 else addEventListener(Event.ADDED_TO_STAGE, init);
34 }
35
36 private function init(e:Event = null):void {
37
38 /**
39 * You can replace the connector used for creating the TuioClient with any connector you'd like to use.
40 */
41 // var tc:TuioClient = new TuioClient(new UDPConnector("0.0.0.0", 3333));
42 var tc:NativeTuioAdapter = new NativeTuioAdapter(stage);
43 tc.addListener(TuioManager.init(stage));
44 var tm:GestureManager = GestureManager.init(stage);
45 GestureManager.addGesture(new DragGesture());
46 GestureManager.addGesture(new ZoomGesture(TwoFingerMoveGesture.TRIGGER_MODE_MOVE)); //TRIGGER_MODE_TOUCH for NativeTuioAdapter
47 GestureManager.addGesture(new RotateGesture(TwoFingerMoveGesture.TRIGGER_MODE_MOVE)); //TRIGGER_MODE_TOUCH for NativeTuioAdapter
48 tDbg = TuioDebug.init(stage);
49 tc.addListener(tDbg);
50
51 /**
52 * And that's it for the tuio part.
53 */
54 tf = new TextField();
55 tf.autoSize = TextFieldAutoSize.LEFT;
56 tf.selectable = false;
57 tf.defaultTextFormat = new TextFormat("Arial", null, 0x999999);
58 tf.appendText("Press the UP arrow key to increase the circle size.");
59 tf.appendText("\nPress the DOWN arrow key to decrease the circle size.");
60 tf.appendText("\nPress SPACE for fullscreen.");
61 tf.x = 11;
62 tf.y = 11;
63
64 this.addChild(tf);
65
66 stage.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown);
67
68 stage.scaleMode = StageScaleMode.NO_SCALE;
69 stage.align = StageAlign.TOP_LEFT;
70
71 var item:DragRotateScaleMe;
72 for (var c:int = 0; c < 10; c++ ) {
73 item = new DragRotateScaleMe(100 + Math.random() * (stage.stageWidth - 200), 100 + Math.random() * (stage.stageHeight - 200), stage.stageWidth / 2, stage.stageHeight / 2);
74 stage.addChild(item);
75 }
76
77 }
78
79 public function handleKeyDown(event:KeyboardEvent):void {
80 if (event.keyCode == Keyboard.DOWN){
81 tDbg.cursorRadius -= 2;
82 } else if (event.keyCode == Keyboard.UP){
83 tDbg.cursorRadius += 2;
84 } else if (event.keyCode == Keyboard.SPACE) {
85 if(stage.displayState == StageDisplayState.NORMAL){
86 stage.displayState = StageDisplayState.FULL_SCREEN;
87 tf.text = "";
88 tf.appendText("Press the UP arrow key to increase the circle size.");
89 tf.appendText("\nPress the DOWN arrow key to decrease the circle size.");
90 tf.appendText("\nPress SPACE for windowmode.");
91 } else {
92 stage.displayState = StageDisplayState.NORMAL;
93 tf.text = "";
94 tf.appendText("Press the UP arrow key to increase the circle size.");
95 tf.appendText("\nPress the DOWN arrow key to decrease the circle size.");
96 tf.appendText("\nPress SPACE for fullscreen.");
97 }
98 }
99 }
100 }
101
102 }
2:定义的一个需要实现手势功能的Sprite对象:
package views
{
import flash.display.Sprite;
import flash.events.TransformGestureEvent;
import org.tuio.TuioTouchEvent;
import flash.geom.*;
public class DragRotateScaleMe extends Sprite {
public var minScale:Number = 0.1;
public var maxScale:Number = 2.5;
private var curID:int = -1;
public function DragRotateScaleMe(x:Number, y:Number, width:Number, height:Number) {
this.graphics.beginFill(Math.random() * 0xcccccc);
this.graphics.drawRect( -width / 2, -height / 2, width, height);
this.graphics.endFill();
this.x = x + width / 2;
this.y = y + height / 2;
this.addEventListener(TransformGestureEvent.GESTURE_PAN, handleDrag);
this.addEventListener(TransformGestureEvent.GESTURE_ZOOM, handleScale);
this.addEventListener(TransformGestureEvent.GESTURE_ROTATE, handleRotate);
this.addEventListener(TuioTouchEvent.TOUCH_DOWN, handleDown);
}
private function handleScale(e:TransformGestureEvent):void {
var p:Point = this.localToGlobal(new Point(e.localX, e.localY));
p = parent.globalToLocal(p);
var m:Matrix = this.transform.matrix;
m.translate( -p.x, -p.y);
m.scale(e.scaleX, e.scaleY);
m.translate(p.x, p.y);
this.transform.matrix = m;
if (this.scaleX > maxScale) {
m = this.transform.matrix;
m.translate( -p.x, -p.y);
m.scale(maxScale/this.scaleX, maxScale/this.scaleY);
m.translate(p.x, p.y);
this.transform.matrix = m;
} else if (this.scaleX < minScale) {
m = this.transform.matrix;
m.translate( -p.x, -p.y);
m.scale(minScale/this.scaleX, minScale/this.scaleY);
m.translate(p.x, p.y);
this.transform.matrix = m;
}
}
private function handleRotate(e:TransformGestureEvent):void {
var p:Point = this.localToGlobal(new Point(e.localX, e.localY));
p = parent.globalToLocal(p);
var m:Matrix = this.transform.matrix;
m.translate(-p.x, -p.y);
m.rotate(e.rotation * (Math.PI / 180));
m.translate(p.x, p.y);
this.transform.matrix = m;
}
private function handleDrag(e:TransformGestureEvent):void {
this.x += e.offsetX;
this.y += e.offsetY;
}
private function handleDown(e:TuioTouchEvent):void {
if (curID == -1) {
stage.setChildIndex(this, stage.numChildren - 1);
this.curID = e.tuioContainer.sessionID;
stage.addEventListener(TuioTouchEvent.TOUCH_UP, handleUp);
}
}
private function handleUp(e:TuioTouchEvent):void {
if(e.tuioContainer.sessionID == this.curID){
this.curID = -1;
stage.removeEventListener(TuioTouchEvent.TOUCH_UP, handleUp);
}
}
}
}
3:移动项目的第一视图firstView:
<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark" title="主页视图"
creationComplete="view2_creationCompleteHandler(event)" xmlns:mx="library://ns.adobe.com/flex/mx">
<fx:Script>
<![CDATA[
import mx.events.FlexEvent;
protected function view2_creationCompleteHandler(event:FlexEvent):void
{
// TODO Auto-generated method stub
var gesMov:GestureManagerExample = new GestureManagerExample();
ui.addChild(gesMov);
}
]]>
</fx:Script>
<fx:Declarations>
<!-- 将非可视元素(例如服务、值对象)放在此处 -->
</fx:Declarations>
<mx:UIComponent id="ui" width="100%" height="100%"/>
</s:View>
例子截图:
这里是手势库的下载地址,
https://files.cnblogs.com/loveFlex/GeoGesture.rar
有问题的朋友请留言~
作者: Binyy
出处: https://www.cnblogs.com/loveFlex
城市:wuhan
微信:momakeyy
详细源码请移步,记得点个星星噢~ https://gitee.com/binyylovesino/lilo-ui 欢迎各路大佬指导、提问~
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 原文链接 如有问题, 可邮件(408460486@qq.com)或者微信咨询.
posted on 2012-02-28 10:09 Binyy_Wuhan 阅读(2780) 评论(2) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义