Подтвердить что ты не робот

Android: OnTouch, MotionEvent.ACTION_MOVE не распознается?

Вот мой код, я хочу определить, когда мой палец идет по экрану, поэтому, когда я касаюсь экрана, я обнаруживаю 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
                    }
                }
            }
}
4b9b3361

Ответ 1

Если ваш метод onTouch() возвращает false в ответ на начальный ACTION_DOWN MotionEvent, он не получит никаких последующих событий, относящихся к этому конкретному жестом. Вместо этого те сенсорные события будут представлены родительскому элементу в иерархии.

Чтобы выразить это другим способом, если вы вернете false из onTouch() во время начала жестов (ACTION_DOWN), он сигнализирует, что метод больше не хочет видеть больше этого жеста, и что события жестов должны перейти к родительскому View.

Как отмечает markproxy в комментариях ниже, возврат false, когда MotionEvent является чем-то иным, чем ACTION_DOWN, например, ACTION_MOVE, не будет препятствовать последующему MotionEvent в текущем жесте представленный View.

Ответ 2

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

Ответ 3

Пара вещей:

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>

Ответ 4

Проверить возвращаемое значение метода onTouch().

он должен быть правдой, а не ложным.

return true;

надеюсь, что это сработает.

Ответ 5

Есть два случая:

1) Если вы также установили OnClickListener() → onTouch(), следует вернуть false.

(Если onTouch() возвращает true, OnClickListener() не будет работать)

2) Если вы не установите OnClickListener() → onTouch(), необходимо вернуть true.

(Если onTouch() возвращает false, вызывается только ACTION_DOWN)