Android:OnTouch,MotionEvent.ACTION\u移动未被识别?
这是我的代码,我想检测我的手指何时进入屏幕,因此当我触摸屏幕时,我会检测到Android:OnTouch,MotionEvent.ACTION\u移动未被识别?,android,ontouchlistener,actionevent,Android,Ontouchlistener,Actionevent,这是我的代码,我想检测我的手指何时进入屏幕,因此当我触摸屏幕时,我会检测到动作\u下降,但当我用手指进入屏幕时,动作\u移动无法识别,动作\u上升 你知道为什么吗 float x=0; protected void onCreate(Bundle savedInstanceState) { do things ImageView image2 = (ImageView) findViewById(R.id.imageView3);
动作\u下降
,但当我用手指进入屏幕时,动作\u移动
无法识别,动作\u上升
你知道为什么吗
float x=0;
protected void onCreate(Bundle savedInstanceState) {
do things
ImageView image2 = (ImageView) findViewById(R.id.imageView3);
image2.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
if (arg1.getAction()==MotionEvent.ACTION_DOWN) {
x=arg1.getX();
}
else {
if (arg1.getAction()==MotionEvent.ACTION_MOVE){
if (arg1.getX()>x) {
do things
}
}
else {
if (arg1.getAction()==MotionEvent.ACTION_UP){
do things
}
}
}
}
MotionEvent.getAction()
返回的不仅仅是标志。请尝试以下操作:
int action = arg1.getAction() & MotionEvent.ACTION_MASK;
if (action == MotionEvent.ACTION_MOVE) ...
您还可以使用MotionEvent.getActionMasked()
。
另请参见如果您的onTouch()
方法返回false
以响应初始的动作
动作事件
,则它将不会接收属于此特定手势的任何后续事件。相反,这些触摸事件将显示给层次结构中的父对象
另一种说法是,如果在手势开始时(动作向下)从onTouch()
返回false
,则表示该方法不想再看到任何手势,手势事件应转到父视图中
正如markproxy在下面的评论中指出的那样,当运动事件
不是动作(向下)
时返回false
,例如动作(移动)
,将不会阻止当前手势中后续的运动事件
呈现给视图
两件事:
1) 您需要返回一个布尔值以显示您正在查看事件
下面是一个非常简单的实现:
package com.test;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
public class TestProjActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final String TAG = "TEST_TAG";
View v = findViewById(R.id.touchTest);
v.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction()==MotionEvent.ACTION_DOWN) {
Log.e(TAG,"Down");
return true;
}
if (event.getAction()==MotionEvent.ACTION_MOVE){
Log.e(TAG,"Move");
return true;
}
if (event.getAction()==MotionEvent.ACTION_UP){
Log.e(TAG,"Up");
return true;
}
return false;
}
});
}
}
下面是main.xml
::
检查onTouch()方法的返回值
这应该是真的,而不是假的
return true;
希望它能起作用。有两种情况:
1) 如果还设置了OnClickListener()->onTouch(),则应返回false
(如果onTouch()返回true,OnClickListener()将不起作用)
2) 如果未设置OnClickListener()->onTouch()应返回true
(如果onTouch()返回false,则只调用ACTION\u DOWN)我不理解getAction和getActionMasked之间的区别,即使读取API也是如此?我尝试了int action=arg1.getAction()&MotionEvent.action_MASK,但不起作用getAction()还返回指针索引(您只需要在处理多个触摸事件时使用指针索引),因此您无法安全地使用带有标志的==但必须使用该MASK或调用getActionMasked()。非常感谢刚刚添加了在动作移动和动作关闭后返回true!我认为要使这个答案正确,还需要稍加改进。当MotionEvent
是一个ACTION\u DOWN
事件时,如果从onTouch()
返回false
,则表示视图
不再想看到任何手势,手势的事件应转到父视图组
。例如,从ACTION\u MOVE
事件返回false
,不会阻止将来的事件路由到此视图
@markproxy。非常感谢-我已经更新了答案,希望它更准确。谢谢。当我改变了返回到真的时候救了我的命。非常感谢。很高兴能提供帮助:)一般来说,代码中有很多不必要的其他/if。如果你把其中一些清理干净,它的阅读和功能都会简单得多。
return true;