HorizontalScrollView - рассчитать позицию остановки после броска - PullRequest
3 голосов
/ 14 марта 2011

С HorizontalScrollView, как мне определить, когда прокрутка останавливается после того, как пользователь перевернул вид?Или, в качестве альтернативы, как узнать, в каком положении будет находиться прокрутка, когда она остановится (тогда я мог бы использовать ее с onScrollChanged).

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

Спасибо

Ответы [ 2 ]

3 голосов
/ 14 сентября 2012

Я написал собственный класс для HorizontalScrollView, который имеет интерфейс с методом остановки прокрутки, который дает позицию scrollX при остановке прокрутки.Вот код:

public class CustomMCSDHorizontalScroll extends HorizontalScrollView {

    private Runnable scrollerTask;
    private int initialPosition;
    private int newCheck = 100;


    public interface onScrollStopedListner{
        void onScrollStoped();
    }

    private onScrollStopedListner onScrollStoped;

    public CustomMCSDHorizontalScroll(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        scrollerTask = new Runnable() {
            @Override
                public void run() {
                    // TODO Auto-generated method stub
                    int newPosition = getScrollX();

                    if ( initialPosition - newPosition == 0 ) {
                        if ( onScrollStoped != null ) {
                            onScrollStoped.onScrollStoped();
                        }
                    } else {
                        initialPosition = getScrollX();
                        CustomMCSDHorizontalScroll.this.postDelayed(
                            scrollerTask, newCheck);
                    }

                }
        };
    }

    public void setOnScrollStopListner (CustomMCSDHorizontalScroll.
            onScrollStopedListner listener) {
        onScrollStoped = listener;
    }

    public void startScrollerTask(){
        initialPosition = getScrollX();
        CustomMCSDHorizontalScroll.this.postDelayed(scrollerTask, newCheck);
    }

}

Вот метод ontouch():

@Override
public boolean onTouch(View v, MotionEvent event) {

    switch (v.getId()) {
        case R.id.mHorizontalScrollViewMain:
            if (event.getAction() == KeyEvent.ACTION_UP) {
                hsvUpperTab.startScrollerTask();
            }
            break;
        case R.id.mHorizontalScrollViewSub:
            if (event.getAction() == KeyEvent.ACTION_UP) {
                hsvLowerTab.startScrollerTask();
            }
        default:
            break;
    }
    return false;
}

Вот метод onScrollStop():

hsvLowerTab.setOnScrollStopListner(new onScrollStopedListner() {
    @Override
    public void onScrollStoped() {
        // TODO Auto-generated method stub
        getLowerTabScrolled(hsvLowerTab.getScrollX());
    }
});

hsvUpperTab.setOnScrollStopListner(new onScrollStopedListner() {
    @Override
    public void onScrollStoped() {
        // TODO Auto-generated method stub
        getUpperTabScrolled(hsvUpperTab.getScrollX());
    }
});
2 голосов
/ 14 марта 2011

Вы можете использовать скроллер для того же самого.

Шаги для использования скроллера.

  1. Подкласс HorizontalScrollView, чтобы иметь пользовательское представление и переопределить методыonTouchEvent, onInterceptTouchEvent для возврата false.
  2. Реализация OnGestureListener в действии.
  3. Передача события движения onFling в метод скроллера

    fling (int startX, int startY, int speedX, int speedY, int minX, int maxX, int minY, int maxY)

  4. Можно использовать следующие методы прокрутки:

getFinalX () getFinalY ()

ИЛИ

Постоянно сканируйте это значение isFinished (), чтобы определить, закончилось ли сбрасывание.

...