链接: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没执行的状态。
转载请注明原文地址: https://ju.6miu.com/read-676212.html