藉助scroller實現側滑功能

基本的滑動操作是通過ScrollTo() 和 ScrollBy()實現。

關於這兩個方法的理解:
很多人對這兩個方法的理解一般從在誤區,起初我對這兩個方法的理解也有問題。我當時以爲這個兩個方法其實移動的就是我們要移動的View ,其實這是有問題的,這兩個方法移動的是承載我們要移動的view的容器。所以正負值和我們一般理解的正負值是正好相反的。

可以這樣理解,相當於我們要移動的view是固定不動的,我們來挪動它的容器以實現移動view的目的。列如我們想讓我們的view向右移動的話,view是固定的,那我們的容器必須向左移動,而向左移動的話以屏幕座標來說是負值,所以我們傳負數。

而這兩個方法是點到點的移動,所以我們通過Scroller實現平滑的移動。

例如側滑關閉頁面,當我們拖拽的距離大於屏幕一般的寬度時我們關閉頁面,否則將頁面滾動到初始位置,而這個滾動的操作就藉助Scroller實現:

    private class ScrollPager extends FrameLayout {


        private final Scroller scroller;
        public ScrollPager(@NonNull Context context) {
            super(context);
            scroller = new Scroller(context);
        }

        private float startX;
        private float lastX;
        int disX = 0;//移動距離

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            int action = event.getAction();
            startX = event.getRawX();
            switch (action) {
                case MotionEvent.ACTION_DOWN:
                    lastX = startX;
                    disX = 0;
                    scroller.abortAnimation();
                    break;
                case MotionEvent.ACTION_MOVE:

                    disX = (int) (lastX - startX);
                    scrollBy(disX, 0);
                    lastX = startX;

                    break;
                case MotionEvent.ACTION_UP:
                    if (Math.abs(getScrollX()) > width / 2) {
                        scroller.startScroll(getScrollX(), 0, -(width-Math.abs(getScrollX())), 0,1000);
                    } else {
                        scroller.startScroll(getScrollX(),0, Math.abs(getScrollX()),0,1000);
                    }
                    invalidate();
                    break;
            }
            return true;
        }

        @Override
        public void computeScroll() {
            if (scroller.computeScrollOffset()) {
                scrollTo(scroller.getCurrX(), scroller.getCurrY());
                postInvalidate();
            }
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章