Seekbar меняет прогресс ТОЛЬКО при перетаскивании большого пальца - PullRequest
1 голос
/ 08 января 2020

Я сталкиваюсь с вопросом о том, как контролировать прогресс Seekbar, когда пользователь ONLY касается Thumb

Я знал, что это дублированный вопрос, но вот ссылки, которые дали мне представление об этом это и это .

После нескольких раундов тестирования ниже приведены мои рабочие логики c результат

mySeekbar.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Rect rcThumb = mySeekbar.getThumb().getBounds();
        int iWidth = rcThumb.width();
        if (event.getX() >= (rcThumb.left - iWidth) && event.getX() <= (rcThumb.right + iWidth)) {
            return false;
        } else
            return true;
    }
});

Ожидаемый результат
без перетаскивания или нажатия
when released
во время перетаскивания или нажатия
enter image description here
Проблема
Вы можете просто скопировать и вставить приведенный выше код для тестирования. Поскольку мы знаем, что при прикосновении или перетаскивании большой палец будет больше, но есть проблема, когда большой палец будет большим, если не прикасаться к нему. Эта проблема случается не часто, но редко. В любом случае, чтобы решить это? Большая помощь приветствуется.

Результат задачи
без перетаскивания или нажатия
when released
во время перетаскивания или нажатия
enter image description here

1 Ответ

0 голосов
/ 16 января 2020

После нескольких раундов тестирования я смог достичь sh результата. Ура:)

  private boolean mIsDragging;

  private boolean isWithinThumb(MotionEvent event, SeekBar seekBar) {
    Rect rcThumb = seekBar.getThumb().getBounds();
    Rect rcDetectTouchArea = new Rect();
    int iWidth = rcThumb.width();
    int iHeight = rcThumb.height();
    rcDetectTouchArea.left = rcThumb.left - iWidth;
    rcDetectTouchArea.right = rcThumb.right + iWidth;
    rcDetectTouchArea.bottom = rcThumb.bottom + iHeight;
    Log.i("TAG", "rcDetectSize.left  = " + rcDetectTouchArea.left + " | rcDetectSize.right = " + rcDetectTouchArea.right + " |  rcDetectSize.bottom = " + rcDetectTouchArea.bottom + " | event.getX()= " + event.getX() + " | event.getY()= " + event.getY() + " | rcThumb  area = " + rcDetectTouchArea.contains((int) event.getX(), (int) event.getY()));
    return rcDetectTouchArea.contains((int) event.getX(), (int) event.getY());
}

  mSbTest.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        if (isWithinThumb(event, mSbTest)) {
                            mIsDragging = true;
                            return false;
                        }
                    case MotionEvent.ACTION_UP:
                        if (mIsDragging) {
                            mIsDragging = false;
                            return false;
                        }
                        if (isWithinThumb(event, mSbTest)) {
                            return false;
                        } else {
                            return true;
                        }
                    case MotionEvent.ACTION_MOVE:
                        if (!mIsDragging) {
                            return true;
                        }
                }
                return onTouchEvent(event);
            }
        });
...