onClickListener не позволяет триггеру onFling

У меня есть onClickListener и onFling (с помощью GestureDetector).

Если я нажму на кнопку onClickListener пожары.

Если я кидаю на тело экрана то onFling пожары.

Однако если я начну кидать с кнопки, то ни один огонь.

Компоновка следующим образом:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
    <Button
            android:id="@+id/myButton"
            android:layout_margin="50dp"
            android:layout_height="100dp"
            android:layout_width="match_parent"
            android:text="Button"/>
</LinearLayout>

И код выглядит так:

public class myLayout extends Activity implements GestureDetector.OnGestureListener {
    private GestureDetector gDetector;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.myLayout);

        gDetector = new GestureDetector(getBaseContext(), this);
        findViewById(R.id.myButton).setOnClickListener(button_OnClickListener);
    }

    final View.OnClickListener button_OnClickListener = new View.OnClickListener() {
        public void onClick(final View buttonView) {
            Toast.makeText(getApplicationContext(), "button pressed", Toast.LENGTH_LONG).show();
        }
    };

    @Override
    public boolean onDown(MotionEvent motionEvent) {
        return true;
    }

    @Override
    public void onShowPress(MotionEvent motionEvent) {
    }

    @Override
    public boolean onSingleTapUp(MotionEvent motionEvent) {
        return false;
    }

    @Override
    public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent2, float v, float v2) {
        return false;
    }

    @Override
    public void onLongPress(MotionEvent motionEvent) {
    }

    @Override
    public boolean onFling(MotionEvent start, MotionEvent finish, float v, float v2) {
        if (start.getRawY() < finish.getRawY()) {
            Toast.makeText(getApplicationContext(), "Fling detected", Toast.LENGTH_LONG).show();
        }
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent me) {
        Log.i("Touch", "onTouchEvent");
        return gDetector.onTouchEvent(me);
    }
}

Как я могу получить onFling быть запущенным первым?

Я посмотрел на другие сообщения для этого (например, блокировка onClick onFling), но не нашел подходящего ответа.

1 ответ

Решение

Вы должны попробовать использовать onInterceptTouchEvent() (или, может быть dispatchTouchEvent(), на данный момент я не уверен, что подойдет лучше) из Button Родитель (или что-то еще выше в иерархии), чтобы решить, следует ли направить касание на кнопку или детектор жестов.

Если MotionEvent координаты принадлежат Button прям и ACTION_DOWN сопровождается ACTION_UP в ближайшее время, это щелчок и должен быть направлен на Button, но если вы получите ACTION_MOVE и движение продолжается до такой степени, что вы знаете, что это удар - это должно быть обработано детектором жестов.

UPD Вот ответ, который объясняет метод /questions/14590375/kak-provesti-razlichie-mezhdu-broskom-i-prikosnoveniem/14590379#14590379

Другие вопросы по тегам