Android读书笔记---弹性滑动

本文详细解析了View的弹性滑动机制,介绍了Scroller如何配合View的computeScroll方法实现滑动,通过不断重绘和时间间隔计算滑动位置。同时,探讨了如何利用动画和延时策略实现更平滑的滑动效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

View弹性滑动
Scroller

本身不能实现滑动,需要配合View的comuteScroll方法才能完成弹性滑动,他不断的让View重绘,每一次重绘距滑动起始时间有一个时间间隔,通过这个时间间隔Scroller就可以得出View的当前的滑动位置,知道了滑动位置就可以通过scrollTo方法来文成View的滑动.就这样,View的每一次重绘都会导致View进行小幅度的滑动,多次小幅度的滑动就组成了弹性滑动,这就是Scroller的工作机制

public void smoothScrollTo(int destX,int destY) {

    int scrollX = getScrollX();
    int deltaX = destX-scrollX;
    mScroller.startScroll(scrollX,0,deltaX,0,1000);
    invalidate();
}

   @Override
public void computeScroll() {
    if (mScroller.computeScrollOffset()) {
        scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
        postInvalidate();
    }
}
动画

动画本身就是一个渐进的过程,因此通过它实现滑动天然就具有弹性效果.
我们可以利用动画的特性实现一些动哈不能实现的效果,比如利用动画的特性,使用scrollTo模仿Scroller的效果

    /**使用scrollTo利用动画的特性实现弹性滑动
 * @param deltaX  横向移动距离,正数向左,负数向右
 */
public void useAnimScrollTo( final int deltaX) {
    ValueAnimator animator = ValueAnimator.ofInt(0,1).setDuration(1000);
    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            float fraction = animation.getAnimatedFraction();
            scrollTo( ((int) getX()+(int)(deltaX*fraction)),0);
        }
    });
    animator.start();
}

这里的滑动针对的是View的内容非View本身

使用延时策略

通过发送一系列的延时消息达到一种渐进的效果.

 private static final int MESSAGE_SCROLL_TO=-1;
private static final int FRAME_COUNT=30;
private static final int DELAYED_TIME=33;
private static final int SCROLL_DELTAX=100;
private int mCount=0;


private Handler mHandler = new Handler(){
    /**向左滑动100的距离
     * @param msg
     */
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case MESSAGE_SCROLL_TO:
                mCount++;
                if (mCount<=FRAME_COUNT) {
                    float fraction = mCount/(float)FRAME_COUNT;
                    int scrollX = (int) (fraction*SCROLL_DELTAX);
                    scrollTo(scrollX,0);
                    mHandler.sendEmptyMessageDelayed(MESSAGE_SCROLL_TO,DELAYED_TIME);
                }
                break;
        }
    }
};




public void scrollByHandler() {
    mHandler.sendEmptyMessage(MESSAGE_SCROLL_TO);
}

上面是利用handler实现弹性滑动的效果

点击查看代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值