Подтвердить что ты не робот

Как получить текущее смещение Y ScrollView

ScrollView имеет метод установки смещения прокрутки x и y, но не метод для получения текущего смещения (все, что мне действительно интересно, это смещение y, так как ScrollView поддерживает только вертикальную прокрутку). Я не вижу никакого метода, который бы работал в суперклассах, и попробовал getTop() для представления содержимого, которое всегда равно нулю. Я что-то пропустил?

4b9b3361

Ответ 2

Если вы уверены, что после использования getScrollY() или getTop() вы должны получить некоторое значение, попробуйте поместить этот метод внутри

yourScroolView.post(new Runnable() {
@Override
public void run() {
    Toast.makeText(getApplicationContext(),"Current Y is : "+getScrollY,Toast.LENGTH_SHORT).show();
            }
        });

Теперь это должно сработать. Согласно моему пониманию об этом методе, он будет работать только после того, как макет будет нарисован. Это может быть одной из причин, по которой вы продолжали получать 0 ранее. Надеюсь, что это поможет.

Ответ 3

Почему бы вам не попробовать что-то подобное?

targetScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
        @Override
        public void onScrollChanged() {
            int scrollX = targetScrollView.getScrollX();
            Log.d(TAG, "scrollX: " + scrollX);
        }
    });

Ответ 5

Я достигаю, чтобы понять следующее. Сначала получите высоту экрана и ширину экрана.

DisplayMetrics metrics = getResources().getDisplayMetrics();
float screenWidth = metrics.widthPixels;
float screenHeight = metrics.heightPixels;

затем, чтобы узнать высоту документа (общее количество, то, что отображается и что находится вне экрана)

public float getDocumentHeight(){
    return (computeVerticalScrollRange() * screenHeight)/computeVerticalScrollExtent();
}

Наконец, чтобы получить смещение

public float getTopY(){
    return (getDocumentHeight() * computeVerticalScrollOffset())/computeVerticalScrollRange();
}

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

public boolean onTouchEvent(MotionEvent event) {
      int y = event.getY() + (int) getTopY();
    }

Вы также можете сделать что-то подобное для обработки ширины