29

这是我的代码,我想检测我的手指何时落下屏幕,所以当我触摸屏幕时,我检测到但当我ACTION_DOWN用手指顺着屏幕向下时,ACTION_MOVE无法识别,ACTION_UP 你知道为什么吗?

        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
                    }
                }
            }
}
4

5 回答 5

106

如果您的onTouch()方法false响应初始的返回ACTION_DOWN MotionEvent,它将不会接收任何属于此特定手势的后续事件。相反,这些触摸事件将呈现给层次结构中的父级。

换一种说法,如果您在手势开始期间返回false( onTouch()the ACTION_DOWN),它表示该方法不再希望看到任何手势,并且手势的事件应该发送给 parent View

正如 markproxy 在下面的评论中指出的那样,false当sMotionEvent不是 an时返回ACTION_DOWN,例如 anACTION_MOVE不会阻止当前手势中的后续MotionEvents 呈现给View.

于 2013-02-08T15:59:55.120 回答
9

MotionEvent.getAction()返回的不仅仅是标志。尝试以下操作:

int action = arg1.getAction() & MotionEvent.ACTION_MASK;
if (action == MotionEvent.ACTION_MOVE) ...

您也可以使用MotionEvent.getActionMasked(). 另请参阅http://developer.android.com/reference/android/view/MotionEvent.html

于 2013-02-08T15:58:15.130 回答
6

几件事:

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

::

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/touchTest"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

</LinearLayout>
于 2013-02-08T16:14:35.130 回答
3

有两种情况:

1) 如果您还设置了 OnClickListener() -> onTouch() 应该返回 false。

(如果 onTouch() 返回 true,则 OnClickListener() 将不起作用)

2) 如果你没有设置 OnClickListener() -> onTouch() 应该返回 true。

(如果 onTouch() 返回 false,则只调用 ACTION_DOWN)

于 2017-05-30T09:47:24.267 回答
2

检查 onTouch() 方法的返回值。

它应该是真的,而不是假的。

return true;

希望它会起作用。

于 2016-02-03T10:48:58.750 回答