Android的Scroller用法

1、Android的Scroller类是一个为View实现平滑的(Help)帮助类。

      Scroller类提供了一个computeScrollerOffset()方法来判断是否完成了整个滑动,同时也提供了getCurrx()、getCurrY()方法来获的当前的滑动坐标,在上面的代码中,唯一

需要注意的是invalidate()方法,因为只能在computeScroll()方法中获取模拟过程中的ScrollX和ScrollY坐标。但computeScroll()方法是不会自动调用的,只能通过invalidate()

→draw()→computeScrooll()来间接调用computeScroll()方法,所以需要在模板代码中调用invalidate()方法,实现循环获取scrollX和scrollY的目的。而当模拟过程结束后,scroller.computeScrollOffset()方法会返回false,从而中断循环,完成怎个平滑的过程。

      实现平滑移动要重写两个方法:

    public  void  startScroll(int  startX, int  startY,int  dx, int  dy, int  duration);
    public   void   startScroll(int  startX, int  startY, int   dx , int  dy);

 这是实现一个自定义View拖动到位置,在回到起始点。

    public class ScrollerView extends View {
     
     
        private Scroller scroller;
     
        public ScrollerView(Context context) {
            super(context);
            initView(context);
        }
     
        public ScrollerView(Context context, AttributeSet attrs) {
            super(context, attrs);
            initView(context);
        }
     
        public ScrollerView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            initView(context);
        }
     
     
        public void initView(Context context) {
     
            setBackgroundColor(Color.GREEN);
            scroller = new Scroller(context);
     
        }
     
        @Override
        public void computeScroll() {
            super.computeScroll();
     
            //判断Scroller是否执行完没。
            if (scroller.computeScrollOffset()) {
                //记住Scroller的滑动当前坐标。
                ((View) getParent()).scrollTo(scroller.getCurrX(), scroller.getCurrY());
                //不停的绘制
                invalidate();
            }
        }
     
     
        int lastX;
        int lastY;
     
        @Override
        public boolean onTouchEvent(MotionEvent event) {
     
    //        int x = (int) event.getX();
    //        int y = (int) event.getY();
     
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    lastX = (int) event.getX();
                    lastY = (int) event.getY();
                    break;
                case MotionEvent.ACTION_MOVE:
     
                    int offsetX = (int) event.getX() - lastX;
                    int offsetY = (int) event.getY() - lastY;
     
                    ((View) getParent()).scrollBy(-offsetX, -offsetY);
                    break;
                case MotionEvent.ACTION_UP:
                    //手指离开时,执行滑动过程
                    View viewGroup = (View) getParent();
     
                    scroller.startScroll(viewGroup.getScrollX(), viewGroup.getScrollY(), -viewGroup.getScrollX(),-viewGroup.getScrollY(),5000);
     
                    invalidate();
                    break;
            }
            return true;
        }
    }
---------------------
作者:mw_陌路
来源:CSDN
原文:https://blog.csdn.net/mw_123456/article/details/49817607
版权声明:本文为博主原创文章,转载请附上博文链接!

posted @ 2019-05-27 21:42  天涯海角路  阅读(652)  评论(0)    收藏  举报