ᴛʜᴇ*_*ᴛᴇʟ 8 java android ontouchlistener onclicklistener android-studio
所以我想我有一个非常简单的问题,但我似乎无法弄清楚。
我有一个ImageView
,我正在使用它的setOnTouchListener
方法 ( OnTouch
)。
如何区分ACTION_DOWN
事件和ACTION_MOVE
事件?
甚至当我只需要点击(触摸)ImageView
,ACTION_MOVE
事件被调用。
我的目标是当用户点击它时打开它(做任何事情),并在用户握住它并移动它时移动它。
private int initialX;
private int initialY;
private float initialTouchX;
private float initialTouchY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
initialX = params.x;
initialY = params.y;
initialTouchX = event.getRawX();
initialTouchY = event.getRawY();
return true;
case MotionEvent.ACTION_UP:
return true;
case MotionEvent.ACTION_MOVE:
params.x = initialX + (int) (event.getRawX() - initialTouchX);
params.y = initialY + (int) (event.getRawY() - initialTouchY);
mWindowManager.updateViewLayout(mImgFloatingView, params);
// Log.d("Params", "X: " + params.x + ". Y: " + params.y + ".");
if(params.x == initialX && params.y == initialY) {
Toast.makeText(getBaseContext(), "Test", Toast.LENGTH_SHORT).show();
}
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
正如其他人所说,由于设备的敏感性和大手指固有的不敏感性,因此ACTION_MOVE
被称为“with” 。ACTION_DOWN
这称为接触斜率。可以通过调整移动时间和距离的阈值来获得您想要的结果。或者,您可以使用手势检测器。
根据问题的标题,我来这里是为了寻找操作的快速参考onTouch
MotionEvent
。这是从文档中复制的片段:
@Override
public boolean onTouchEvent(MotionEvent event){
int action = event.getActionMasked();
switch(action) {
case (MotionEvent.ACTION_DOWN) :
Log.d(DEBUG_TAG,"Action was DOWN");
return true;
case (MotionEvent.ACTION_MOVE) :
Log.d(DEBUG_TAG,"Action was MOVE");
return true;
case (MotionEvent.ACTION_UP) :
Log.d(DEBUG_TAG,"Action was UP");
return true;
case (MotionEvent.ACTION_CANCEL) :
Log.d(DEBUG_TAG,"Action was CANCEL");
return true;
case (MotionEvent.ACTION_OUTSIDE) :
Log.d(DEBUG_TAG,"Movement occurred outside bounds " +
"of current screen element");
return true;
default :
return super.onTouchEvent(event);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码可以在活动或子类视图中使用。如果不需要对视图进行子类化,则可以通过向OnTouchListener
视图添加 来跟踪相同的运动事件。(示例也取自文档)
View myView = findViewById(R.id.my_view);
myView.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
// ... Respond to touch events
return true;
}
});
Run Code Online (Sandbox Code Playgroud)
返回true
意味着未来的事件仍将被处理。因此,如果您返回false
,ACTION_DOWN
那么所有其他事件(例如移动或向上)都将被忽略。
小智 1
正在发生的事情是 View.OnTouchListener 将向您发送所有事件。如果您点击并仅移动 1 个像素,它将被注册为 ACTION_MOVE。
您需要实现一些逻辑来确定“保持”操作 - 等待 100 毫秒或类似的时间 - 之后可以继续进行“拖动”操作。在那之前,它应该只是一个“点击”操作。
归档时间: |
|
查看次数: |
14108 次 |
最近记录: |