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;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值