Scoller 实现 滚动位置自动复位

今天公司有个需求,需要左右滚动停止后,item进行复位。

个人心得记录,也许错误很多,还望留言指正

1、scrollTo 是瞬间跳过去的,但是如果每次 To的距离很近,且动作很快,看起来就像是很连贯的动画,这个类似于快速翻阅连环画那个

2、Scoller 这个类并不直接参与滚动,它只是一个辅助计算的工具。

举例:

一、轻触滚动,也就是慢慢滚动

当手指抬起时,也就是 UP事件结束的时候,这时候假如 控件 滚动到了 100,但是你的需求是需要当手指抬起时,让控件慢慢滚动到 150。如果直接用 scrollTo就会直接跳过去,没有动画效果。

1、在 UP 事件内,调用         scroller.startScroll(curX, 0, moveWidth, 0);  第一个参数 是你开始 滚动的位置X,第二个是 开始滚动的 Y,第三个是你要 滚动的距离X,第四个是你要滚动的距离Y    如上面 则写成          

        scroller.startScroll(curX, 0, moveWidth, 0);
        invalidate();

也就是沿着X轴滚动 50

2、这时候View会去调用  computeScroll() 这个方法,这个方法是需要重写的。在这个方法里面,我们可以进行 scrollTo的操作

 @Override
    public void computeScroll() {
        if (scroller.computeScrollOffset()) {
	    //执行 scrollTo
           //scroller.getCurrX() 获取当前滚动到的X轴坐标

            invalidate();
        }
    }


二、如果你需要快速滑动,也就是飞起的那个感觉

先创建可以对事件进行速率计算的对象,下面代码放在 Down事件 之前

  if (velocityTracker == null) {
            velocityTracker = VelocityTracker.obtain();
        }
        velocityTracker.addMovement(ev);


然后在 UP 时进行速率的计算
velocityTracker.computeCurrentVelocity(1000);
                float velocityX = velocityTracker.getXVelocity();
                float velocityY = velocityTracker.getYVelocity();
                velocityTracker.recycle();
                velocityTracker = null;

我看有不少代码 执行 velocityTracker = null ,不知道为什么,我也没用测

Math.abs(velocityX) > 50


我这里用的是50速率,大家可以按照自己的需求,如果是 > 50 ,就 执行

                    scroller.fling(int startX, int startY, int velocityX, int velocityY,int minX, int maxX, int minY, int maxY));
                    invalidate();
                    return true;

这时候会去调用 computeScroll() 这个方法,我们可以对 fling 做个标记位,如果是 fling 触发的 computeScroll,那么当 scroller.computeScrollOffset() 等于 false时,也就是控件停下来时,再进行一次复位。


具体方法解释可以看这个网址


http://www.360doc.com/content/13/1219/17/11537979_338452870.shtml





  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值