Есть ли лучший способ сделать кнопку кликабельной и подвижной (drag & Drop) - PullRequest
0 голосов
/ 04 апреля 2019

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

Я нашел способ сделать это здесь: Как перетащить плавающую кнопку действия на пейджер вида

но проблема в том, что когда вы пытаетесь щелкнуть, это обычно рассматривается как действие перетаскивания, потому что при касании экрана происходит «микро» движение. поэтому ПЕРЕКЛЮЧАТЕЛЬ проходит через случай ACTION_MOVE.

Поэтому я добавил сравнение отметки времени, когда выполняются ACTION_DOWN и ACTION_UP. и учтите, что если эти два действия произойдут менее чем через 200 миллисекунд, они будут выполнены как щелчок.

это похоже на работу, но, поскольку я действительно очень новичок в Android, я хочу знать, есть ли лучший способ сделать это.

ТНХ

    public boolean onTouch(View v, MotionEvent event) {
    switch (event.getActionMasked()) {
        case MotionEvent.ACTION_DOWN:
            startDrag = System.currentTimeMillis();
            dX = v.getX() - event.getRawX();
            dY = v.getY() - event.getRawY();
            lastAction = MotionEvent.ACTION_DOWN;
            break;

        case MotionEvent.ACTION_MOVE:
            v.setY(event.getRawY() + dY);
            v.setX(event.getRawX() + dX);
            stopDrag = System.currentTimeMillis();
            stopDrag = stopDrag-startDrag;
            if(stopDrag<200){
                lastAction = MotionEvent.ACTION_DOWN;
            }else{
                lastAction = MotionEvent.ACTION_MOVE;}
             break;

        case MotionEvent.ACTION_UP:
            if (lastAction == MotionEvent.ACTION_DOWN) {
                if (mp.isPlaying()) {
                    mp.stop();
                    mp.reset();
                    playMp3((String) v.getContentDescription());
                }else playMp3((String) v.getContentDescription());
            }
            break;

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