我试图在拖动按钮时获取 X、Y 坐标,但由于某种原因,触摸监听器上附加的下面的代码仅触发两次,而不是在拖动时不断更新,即使有 trothing 我也会感到满意为了提高性能,但正如我所说,onTouch
方法仅在操作按下时触发,并且稍后再触发一次。
这是我的代码:
final Button dragBtn = (Button) findViewById(R.id.MyTestButton);
dragBtn.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent me) {
// TODO Auto-generated method stub
ClipData data = ClipData.newPlainText("", "");
View.DragShadowBuilder shadow = new View.DragShadowBuilder(dragBtn);
v.startDrag(data, shadow, null, 0);
int action = me.getAction();
if (action==MotionEvent.ACTION_DOWN) {
Log.i("TEST", "ACTION_DOWN");
return true;
}
if (action==MotionEvent.ACTION_MOVE){
Log.i("TEST", "ACTION_MOVE");
float x = me.getX();
float y = me.getY();
//TODO: Rest of my code here.
return true;
}
if (action==MotionEvent.ACTION_UP){
Log.i("TEST", "ACTION_UP");
return true;
}
Log.i("TEST", "UKNOWN ACTION");
return true;
}
});
在日志中我刚刚:
ACTION_DOWN
WindowManager﹕ Drag already in progress
UKNOWN ACTION
最佳答案
您希望在 OnDragListener
中捕获 X 和 Y 坐标数据,而不是在 OnTouchListener
中。在您在屏幕上拖动对象的整个过程中,Android 会将其解释为单个 ACTION_MOVE 事件,因此您只能从中获取一次数据。将以下代码放入自定义 OnDragListener
类中:
@Override
public boolean onDrag(View v, DragEvent event) {
int action = event.getAction();
float xCoord;
float yCoord;
if(action == DragEvent.ACTION_DRAG_LOCATION) {
xCoord = event.getX();
yCoord = event.getY();
}
return event.getResult(); //returns true for valid drop or false for invalid drop
}
在自定义 OnDragListener
类的其他位置,您必须对 xCoord 和 yCoord 数据执行某些操作。例如,在我的应用程序中,我的“调试”版本的应用程序上有一个 TextView
,其中显示 xCoord 和 yCoord 数据。在 if(action == DragEvent.ACTION_DRAG_LOCATION){...
部分中获取这两个值后,我立即执行 TextView.setText()
方法。
希望这有帮助。
关于java - OnTouch MotionEvent Action 移动未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32667910/