Как синхронизировать простой жест со слушателем onTouch - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть линейный макет, к которому я добавляю и изменяю несколько кнопок программно. Мне нужно, чтобы кнопки реагировали на onClick и могли перемещать их.

Код, который я использую, похоже, должен работать, но часто кнопка не реагирует на Action_Up, который выравнивает кнопку после перетаскивания, и иногда кнопка также «нажата», когда она должна только двигаться. Я создаю детектор жестов в onCreate,

    gestureDetector = new GestureDetector(this, new SingleTapConfirm());

и onTouch во время настройки каждой кнопки

    btn.setOnTouchListener(mover);


View.OnTouchListener mover = new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // adds selected letter to answer (from onClickListener)
        if (gestureDetector.onTouchEvent(event)) {
            append(v);
            // single tap
            return true;
        }
        switch (event.getAction()) {

            case MotionEvent.ACTION_DOWN:

                dX = v.getX() - event.getRawX();
                dY = v.getY() - event.getRawY();
                break;

            case MotionEvent.ACTION_MOVE:

                v.animate()
                        .x(event.getRawX() + dX)
                        .y(event.getRawY() + dY)
                        .setDuration(0)
                        .start();
                break;

                case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_BUTTON_RELEASE:

                Log.d("onTouch", "here");
                Arrays.sort(buttons, new Comparator<Button>() {
                    @Override
                    public int compare(Button b1, Button b2) {
                            if (b1.getX() > b2.getX()) return 1;
                            else return -1;
                    }
                });

                StringBuilder sb = new StringBuilder();
                for (int cl = 0; cl < 15; cl++)
                    sb.append(buttons[cl].getContentDescription());

                Log.d("Buttonsb", sb.toString());

                alignButtons(sb.toString());

            default:
                return false;
        }
        return true;
    }
};

private class SingleTapConfirm extends GestureDetector.SimpleOnGestureListener {

    @Override
    public boolean onSingleTapUp(MotionEvent event) {
        return true;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...