[Android分享] 使用触摸手势(五)
来源:互联网 发布:表格文字识别软件 编辑:程序博客网 时间:2024/05/20 17:40
原文链接:http://developer.android.com/training/gestures/scale.html
拖动和缩放
拖动一个对象
触屏的常见操作是在屏幕上拖动一个对象。
1.在一个拖动操作中,应用程序需要保持对最初始点的跟踪,即使有其他的手指放置在屏幕上。例如,想象一下,当用户在屏幕上拖动图像,用户将第二个手指放在了屏幕上,并将第一个手指抬起。如果你的应用程序仅仅追踪单个点,那么它将会把第二个点作为目标位置并将图像移向那个位置。
2.为了阻止这种情况的发生,你的应用程序需要区分初始的点和后续的点。当后续的点按下或抬起时,ACTION_POINTER_DOWN和ACTION_POINTER_UP将会被传递到onTouchEvent()回调函数。
3.在ACTION_POINTER_UP的情况下,示例提取该触摸点的index,并确定该点ID有没有表示一个不再触摸屏幕的点。如果是这样,应用程序会选取一个不同的点进行激,并保存它的x和y坐标。由于这个保存的位置被用到ACTION_MOVE情况下来计算移动对象的距离,所以应用程序将使用正确的点计算移动的距离和位置。
下面的代码段能使用户在屏幕上拖动一个对象。它记录了初始点的位置,计算点移动的距离,并将对象移动到新的位置。它正确的处理了附加点的可能性。
你应该始终使用getActionMasked方法来获取一个MotionEvent的action。代码片段,双击复制 010203040506070809101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778// The ‘active pointer’ is the one currently moving our object.
private
int
mActivePointerId = INVALID_POINTER_ID;
@Override
public
boolean
onTouchEvent(MotionEvent ev) {
// Let the ScaleGestureDetector inspect all events.
mScaleDetector.onTouchEvent(ev);
final
int
action = MotionEventCompat.getActionMasked(ev);
switch
(action) {
case
MotionEvent.ACTION_DOWN: {
final
int
pointerIndex = MotionEventCompat.getActionIndex(ev);
final
float
x = MotionEventCompat.getX(ev, pointerIndex);
final
float
y = MotionEventCompat.getY(ev, pointerIndex);
// Remember where we started (for dragging)
mLastTouchX = x;
mLastTouchY = y;
// Save the ID of this pointer (for dragging)
mActivePointerId = MotionEventCompat.getPointerId(ev,
0
);
break
;
}
case
MotionEvent.ACTION_MOVE: {
// Find the index of the active pointer and fetch its position
final
int
pointerIndex =
MotionEventCompat.findPointerIndex(ev, mActivePointerId);
final
float
x = MotionEventCompat.getX(ev, pointerIndex);
final
float
y = MotionEventCompat.getY(ev, pointerIndex);
// Only move if the ScaleGestureDetector isn't processing a gesture.
if
(!mScaleDetector.isInProgress()) {
// Calculate the distance moved
final
float
dx = x - mLastTouchX;
final
float
dy = y - mLastTouchY;
mPosX += dx;
mPosY += dy;
invalidate();
}
// Remember this touch position for the next move event
mLastTouchX = x;
mLastTouchY = y;
break
;
}
case
MotionEvent.ACTION_UP: {
mActivePointerId = INVALID_POINTER_ID;
break
;
}
case
MotionEvent.ACTION_CANCEL: {
mActivePointerId = INVALID_POINTER_ID;
break
;
}
case
MotionEvent.ACTION_POINTER_UP: {
final
int
pointerIndex = MotionEventCompat.getActionIndex(ev);
final
int
pointerId = MotionEventCompat.getPointerId(ev, pointerIndex);
if
(pointerId == mActivePointerId) {
// This was our active pointer going up. Choose a new
// active pointer and adjust accordingly.
final
int
newPointerIndex = pointerIndex ==
0
?
1
:
0
;
mLastTouchX = MotionEventCompat.getX(ev, newPointerIndex);
mLastTouchY = MotionEventCompat.getY(ev, newPointerIndex);
mActivePointerId = MotionEventCompat.getPointerId(ev, newPointerIndex);
}
break
;
}
}
return
true
;
}
使用触摸执行缩放
GestureDetector能够帮助你监听常见的手势。对于缩放,Android提供了ScaleGestureDetector. GestureDetector,ScaleGestureDetector能被用来检测更多的手势。代码片段,双击复制 010203040506070809101112131415161718192021222324252627282930313233343536373839404142private
ScaleGestureDetector mScaleDetector;
private
float
mScaleFactor =
1
.f;
public
MyCustomView(Context mContext){
...
// View code goes here
...
mScaleDetector =
new
ScaleGestureDetector(context,
new
ScaleListener());
}
@Override
public
boolean
onTouchEvent(MotionEvent ev) {
// Let the ScaleGestureDetector inspect all events.
mScaleDetector.onTouchEvent(ev);
return
true
;
}
@Override
public
void
onDraw(Canvas canvas) {
super
.onDraw(canvas);
canvas.save();
canvas.scale(mScaleFactor, mScaleFactor);
...
// onDraw() code goes here
...
canvas.restore();
}
private
class
ScaleListener
extends
ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public
boolean
onScale(ScaleGestureDetector detector) {
mScaleFactor *= detector.getScaleFactor();
// Don't let the object get too small or too large.
mScaleFactor = Math.max(
0
.1f, Math.min(mScaleFactor,
5
.0f));
invalidate();
return
true
;
}
}
- [Android分享] 使用触摸手势(五)
- [Android分享] 使用触摸手势(一)
- [Android分享] 使用触摸手势(二)
- [Android分享] 使用触摸手势(四)
- [Android分享] 使用触摸手势(六)
- Android 手势&触摸事件
- Android 手势&触摸事件
- android 触摸手势 OnGestureListener
- Android 手势&触摸事件
- Android 手势&触摸事件
- Android 手势&触摸事件
- Android 手势&触摸事件
- Android触摸手势
- Android之触摸手势检测GestureDetector使用详解
- 手势识别(五)触摸事件与手势识别重要知识点
- Android 手势&触摸事件。手势各种状态
- Android ViewFlipper 手势触摸案例
- Android ViewFlipper 手势触摸案例
- HttpClient三种不同的服务器认证客户端方案
- Note
- D - 畅通工程再续
- Google’s tile engine explained
- POM详解
- [Android分享] 使用触摸手势(五)
- Android程序的安全系统 apk获得root权限
- linux下tar.gz、tar、bz2、zip等解压缩、压缩命令小结
- 怎么查看使用80端口的进程
- 坐标下降与梯度下降
- 二叉查找树(二叉排序树)的详细实现
- [Android分享] 使用触摸手势(六)
- poj3621 Sightseeing Cows bellman-ford 判负权环
- Youzi2D推出开源HTML5游戏加速引擎