Android - Обнаружение жестов (проведите пальцем вверх/вниз) в определенном представлении

Я пытаюсь реализовать OnGestureListener в Android.
В моем макете есть три TextView.
Чего я пытаюсь достичь, так это установить прослушиватель жестов для двух текстовых представлений.
Вот макет -

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rlMain"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/tvOne"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="5dp"
        android:gravity="center"
        android:text="One" />

    <TextView
        android:id="@+id/tvTwo"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tvOne"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="5dp"
        android:gravity="center"
        android:text="Two" />

    <TextView
        android:id="@+id/tvThree"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tvTwo"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="5dp"
        android:gravity="center"
        android:text="Three" />

</RelativeLayout>

А вот активность

    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.GestureDetector;
    import android.view.GestureDetector.OnGestureListener;
    import android.view.MotionEvent;

    public class TimeActivity extends Activity implements OnGestureListener {

    GestureDetector gestureScanner;

    @SuppressWarnings("deprecation")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.wheelview);
        gestureScanner = new GestureDetector(this);

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        return gestureScanner.onTouchEvent(event);
    }

    @Override
    public boolean onDown(MotionEvent e) {
        // TODO Auto-generated method stub
        return true;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
        // TODO Auto-generated method stub
        Log.i("Test", "On Fling");
        return true;
    }

    @Override
    public void onLongPress(MotionEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
            float distanceY) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void onShowPress(MotionEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        // TODO Auto-generated method stub
        return false;
    }
}

В настоящее время вызывается Fling для всех трех текстовых представлений.
Есть ли способ, с помощью которого я могу установить Прослушиватель жестов для некоторых конкретных представлений в макете.
Любая помощь будет быть высоко оценен.


person Anukool    schedule 18.02.2013    source источник


Ответы (3)


Сделайте это в своем методе onCreate.

findViewById(R.id.tvOne).setOnTouchListener(new View.OnTouchListener() { 
            @Override
           public boolean onTouch(View v, MotionEvent event){
                return gestureScanner.onTouchEvent(event);
           }
  });
person M-WaJeEh    schedule 18.02.2013
comment
Спасибо за ответ. Оба ответа правильные. Я не могу принять оба ответа, я голосую за вас обоих. - person Anukool; 18.02.2013
comment
Как установить onLongPress для определенного макета (относительно). - person reegan29; 23.05.2015
comment
@reegan29, точно так же. Один из методов переопределения в GestureDetector — onLongPress(). - person Tash Pemhiwa; 13.07.2016
comment
Как мы можем узнать, какое мнение было отвергнуто? - person Srujan Barai; 09.06.2017
comment
@SrujanBarai В приведенном выше случае View с идентификатором R.id.tvOne есть слушатель, так что к нему прикасаются. Или вы можете использовать View, переданный в onTouch() - person M-WaJeEh; 10.06.2017
comment
О, это очевидно, но метод onFling не имеет параметра view. - person Srujan Barai; 10.06.2017
comment
Как я могу использовать ACTION_MOVE с помощью этого сканера жестов - person vishal patel; 03.02.2018

Вы можете установить OnTouchListeners для отдельных TextViews.

findViewById(R.id.tvOne).setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View view, MotionEvent event) {
         // Your code here
    }
}
person jaibatrik    schedule 18.02.2013

Предложение

Если вы не хотите обнаруживать все жесты, попробуйте этот класс: SimpleGestureListener, созданный сам.

Теперь вот несколько фрагментов использования этого класса.

использование

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private GestureDetector mDetector;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SimpleGestureListener simpleGestureListener = new SimpleGestureListener();
        simpleGestureListener.setListener(new SimpleGestureListener.Listener() {
            @Override
            public void onScrollHorizontal(float dx) {
                Log.i(TAG,"horizontal = " +dx);
            }

            @Override
            public void onScrollVertical(float dy) {
                Log.i(TAG,"vertical = " +dy);
            }
        });
        mDetector = new GestureDetector(this, simpleGestureListener);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        mDetector.onTouchEvent(event);
        return super.onTouchEvent(event);
    }
}

Его можно использовать для обнаружения жеста смахивания:

  • влево или вправо
  • вверх или вниз
person Community    schedule 21.02.2017
comment
Пожалуйста, сделайте ваш интерфейс Listener общедоступным в вашем проекте github, спасибо. - person Umair Khalid; 29.08.2017