通常简单的数学,但我没有找到正确的解决方案。首先,我有一个触摸式监听器,可以拖放在我的情况下称为贴纸的imageview。然后,当用户在贴纸上按住手指至少1秒钟时,将启动拖动模式,用户可以拖动图像视图。
不幸的是,我现在使用贴纸的中间位置,但我想要真实触摸imageview的位置。
这就是我对touchevent的把握
@Override
public boolean onTouch(View v, MotionEvent event) {
if (v instanceof Sticker) {
Log.i(TAG, "onTouch()");
Sticker sticker = (Sticker) v;
Log.i("Sticker"," Found "+sticker.isFound());
Log.i("Sticker"," Found "+sticker.moving);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.i("Sticker", " Found moving");
handler.postDelayed(mLongPressed, LONGPRESS_TIME);
//Take time for the short click
tslong = System.currentTimeMillis() / 1000;
if(sticker.isFound()) {
//Get X,Y for the threshold
mDownX = event.getX();
mDownY = event.getY();
}
break;
case MotionEvent.ACTION_MOVE:
Log.i("Sticker"," Found moving");
if(sticker.isFound()) {
if (sticker.moving) {
if (Math.abs(mDownX - event.getX()) > SCROLL_THRESHOLD || Math.abs(mDownY - event.getY()) > SCROLL_THRESHOLD)
handler.removeCallbacks(mLongPressed);
sticker.coodinates.x = event.getRawX() - sticker.getWidth() / 2;
sticker.coodinates.y = event.getRawY() - sticker.getHeight() * 2 / 3;
if (sticker.coodinates.x > (layoutSizeWidth * 0.99) - sticker.getWidth()) {
sticker.coodinates.x = (float) ((layoutSizeWidth * 0.99)- sticker.getWidth());
} else if (sticker.coodinates.x < 0) {
sticker.coodinates.x = 1;
}
if (sticker.coodinates.y > layoutSizeHeight - (sticker.getHeight() * 2 / 2)) {
sticker.coodinates.y = layoutSizeHeight - (sticker.getHeight() * 2 / 2);
} else if (sticker.coodinates.y < 0) {
sticker.coodinates.y = 1;
}
sticker.setX(sticker.coodinates.x);
sticker.setY(sticker.coodinates.y);
}
}
break;
case MotionEvent.ACTION_UP:
if((System.currentTimeMillis()/1000) - tslong < INVOKE_POPUP_TIME)
handleSimpleClick(v, event);
if(sticker.isFound()) {
if (sticker.moving) {
sticker.setX(sticker.coodinates.x);
sticker.setY(sticker.coodinates.y);
mDownX = event.getX();
mDownY = event.getY();
sticker.moving = false;
}
handler.removeCallbacks(mLongPressed);
}
break;
}
return true;
}
return false;
}
在这里,当用户触摸贴纸1秒钟时,我设置贴纸的位置。
sticker.coodinates.x = event.getRawX() - sticker.getWidth() / 2;
sticker.coodinates.y = event.getRawY() - sticker.getHeight() * 2 / 3;
这是一个更好理解的gif: enter link description here
仔细观察,您会看到跳转到触控输入。但贴纸应在触摸位置上可拖动。很难用英语说:我甚至无法用我的母语解释它。
答案 0 :(得分:0)
对不起伙计们。最后,我发现了错误。首先,我必须保存X和Y坐标之间的差距。之后,在Motion事件切换到Action_Move之前,我将触摸事件的当前输出减去我的计算。
这里是Action_Down案例的代码:
getLocationInWindow(startingPointOfImage);
gapX = (int)(event.getRawX()-startingPointOfImage[0]);
gapY = (int)(event.getRawY()-startingPointOfImage[1]);
现在我得到了事件的输入,并通过计算差距来减去它们。
sticker.coodinates.x = event.getRawX()-gapX;
sticker.coodinates.y = event.getRawY()-gapY;
以将当前X和Y值设置为imageview
结束sticker.setX(sticker.coodinates.x);
sticker.setY(sticker.coodinates.y);