我想知道如何使整个符号(图像)可滚动?我已经找到了如何进行多点触控缩放以进行缩放,但我找不到任何代码示例可以让我只用一根手指垂直滚动图像。
所以我想做的就是用单指输入使图像上下滚动。有没有人可以给我的简单方法或示例代码?
我想知道如何使整个符号(图像)可滚动?我已经找到了如何进行多点触控缩放以进行缩放,但我找不到任何代码示例可以让我只用一根手指垂直滚动图像。
所以我想做的就是用单指输入使图像上下滚动。有没有人可以给我的简单方法或示例代码?
有两种方法可以在 AS3 移动项目中使图像可滚动:使用平移手势(两根手指),或使用鼠标向下、移动和向上(一根手指 - 触摸事件在移动设备上注册为鼠标事件)。下面的示例支持两者。
注意:对于鼠标事件,您可能需要考虑添加一个计时器来区分单击和拖动(如示例所示)。
// Necessary imports for this example - I use Flash Builder, so I'm not sure what CS5 requires.
import flash.display.DisplayObject;
import flash.events.MouseEvent;
import flash.events.TransformGestureEvent;
import flash.geom.Point;
import flash.ui.Multitouch;
import flash.ui.MultitouchInputMode;
import flash.utils.getTimer;
public class ScrollExample {
// The image or other display object you want to scroll
private var t:DisplayObject;
// Dragging variables
private var _prevX:Number; // Not required in this case since we're only scrolling vertically
private var _prevY:Number;
private var _dragging:Boolean = false;
private var _lastMouseEvent:int;
// Minimum touch time to permit drag (in milliseconds) - I use
private static const MIN_DRAG_TIME:Number = 150;
public function ScrollExample() {
// Switch multitouch mode to support gestures (touch/mouse events are still registered)
Multitouch.inputMode = MultitouchInputMode.GESTURE;
// For my applications, I have found that the stage is much more responsive to touch events, but you may want to change "stage" here to "t"
// Pan Gesture - two fingers up and down - like the scroll on a Mac
stage.addEventListener(TransformGestureEvent.GESTURE_PAN, onPan);
// Mouse down, move, and up - one finger drag
stage.addEventListener(MouseEvent.MOUSE_DOWN, onStartDrag);
stage.addEventListener(MouseEvent.MOUSE_MOVE, onMoveDrag);
stage.addEventListener(MouseEvent.MOUSE_UP, onStopDrag);
}
private function onPan(e:TransformGestureEvent):void {
// Move target display object by equivalent offset from pan object
// For only vertical scrolling, don't use X!
//t.x += e.offsetX;
t.y += e.offsetY;
}
private function onStartDrag(e:MouseEvent):void {
// Start timer to differentiate between click and drag
_lastMouseEvent = getTimer();
// Start dragging
_dragging = true;
// Set drag location values to track how drag is occuring
// For only vertical scrolling, don't use X!
//_prevX = e.stageX;
_prevY = e.stageY;
}
private function onMoveDrag(e:MouseEvent):void {
// If mouse down for less than minimum time, don't drag
if (getTimer() > _lastMouseEvent + MIN_DRAG_TIME && _dragging) {
// Move target display object to a valid location - prevents scrolling too far
// Not using X...
// t.x = ValidXDragPosition(e);
t.y = ValidYDragPosition(e);
// Reset drag position values
_prevX = e.stageX;
_prevY = e.stageY;
}
}
private function onStopDrag(e:MouseEvent):void {
// Stop dragging
_dragging = false;
// If mouse down time was less than min time, count as click
if (getTimer() <= _lastMouseEvent + MIN_DRAG_TIME) {
onClick(e);
}
}
private function onClick(e:MouseEvent):void {
// Handle your click event here...
}
// This function prevents your target display object from moving too far
// In this example, it stops dragging when the display object boundary is reached
// (Only showing Y direction)
private function ValidYDragPosition(e:MouseEvent):Number {
// Get the requested drag amount
var requestedPoint:Number = _prevY - e.stageY;
if (t.y - requestedPoint > 0) {
// If drag will move target too far down, stop at top of object
return 0;
} else if (t.y - requestedPoint < stage.stageHeight - t.height) {
// If drag will move target too far up, stop at bottom of object
return stage.stageHeight - t.height;
} else {
// Otherwise, allow drag by requested amount
return t.y - requestedPoint;
}
}
}