链接:http://www.2cto.com/kf/201109/102541.html
主要思想代码:
通过动态设置imageView的位置。来实现同步图片位置的移动。
private View.OnTouchListener movingEventListener = new View.OnTouchListener() {
int lastX, lastY;
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
int X = (int) event.getRawX();
int Y = (int) event.getRawY();
switch (action) {
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
int dx = (int) event.getRawX() - lastX;
int dy = (int) event.getRawY() - lastY;
int left = v.getLeft() + dx;
int top = v.getTop() + dy;
int right = v.getRight() + dx;
int bottom = v.getBottom() + dy;
// 设置不能出界
if (left < 0) {
left = 0;
right = left + v.getWidth();
}
if (right > screenWidth) {
right = screenWidth;
left = right - v.getWidth();
}
if (top < 0) {
top = 0;
bottom = top + v.getHeight();
}
if (bottom > screenHeight) {
bottom = screenHeight;
top = bottom - v.getHeight();
}
v.layout(left, top, right, bottom);
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;
default:
break;
}
return true;
}
}; v.layout是相对与屏幕内布局的坐标的。getX();也是相对与屏幕布局的坐标。
而getRawX()是相对整个手机屏幕的左上角的。
因此如果利用getRawX()来计算布局内的坐标是会不准确的。
关于触屏事件原理的解释:(事情往往没有想象的简单啊,不懂的话很有可能做出一些奇怪的bug)
三个之间是有一定的关系。可以看做通过次数来计算的。
第一次进入触屏事件,默认你执行了down事件(即时你根本没有执行过down事件。比如在第一次进入触屏之后直接return)
之后一段时间内进入触屏事件会当做move来处理。(这意味着没有绝对的第一次执行down事件,可能第一次在你看来相当于直接执行了move。比如在第一次进入触屏事件之后直接return,就会出现下次直接执行move的情况。。。。),之后的一段时间内的触屏事件都当做move来处理,直到你执行了up
最后会当做up处理。up完之后会恢复到down没执行的状态。