天天记录 - 从源码分析ScrollBy和ScrollTo仅执行onDraw方法

本文详细分析了Android中ScrollBy和ScrollTo方法的实现,探讨它们如何影响视图的滚动行为,特别是如何触发onDraw方法的调用。通过源码解析,揭示了这两个方法在UI更新中的关键角色,帮助开发者更好地理解和优化UI滚动性能。
摘要由CSDN通过智能技术生成


1. 先来看看View.scrollBy的源码


    public void scrollBy(int x, int y) {
        scrollTo(mScrollX + x, mScrollY + y);
    }

从注释中可以获知,scrollBy 方法把视图移动到当前的相应偏移位置。其中调用scrollTo

2. 查看View.scrollTo源码
    public void scrollTo(int x, int y) {
        if (mScrollX != x || mScrollY != y) {
            int oldX = mScrollX;
            int oldY = mScrollY;
            mScrollX = x;
            mScrollY = y;
            invalidateParentCaches();
            onScrollChanged(mScrollX, mScrollY, oldX, oldY);
            if (!awakenScrollBars()) {
                postInvalidateOnAnimation();
            }
        }
    }

View.scrollTo方法调用  awakenScrollBars


3. 查看view.awakenScrollBars

    protected boolean awakenScrollBars() {
        return mScrollCache != null &&
                awakenScrollBars(mScrollCache.scrollBarDefaultDelayBeforeFade, true);
    }

awakenScrollBars


4. 查看View.awakenScrollBars(int startDelay, boolean invalidate)
    protected boolean awakenScrollBars(int startDelay, boolean invalidate) {
        final ScrollabilityCache scrollCache = mScrollCache;

        ......

        if (isHorizontalScrollBarEnabled() || isVerticalScrollBarEnabled()) {

           ......

            return true;
        }

        return false;
    }

单从字面意思理解isHorizontalScrollBarEnabled() || isVerticalScrollBarEnabled() 当前视图没有显示横向和纵向scrollbar ,所以4方法返回false。
3中调用4方法获取其返回值false,2中调用3 获取返回值false ,2中if判断!awakenScrollBars() 为true,执行postInvalidateOnAnimation

4. 查看view.postInvalidateOnAnimation
    /**
     * <p>Cause an invalidate to happen on the next animation time step, typically the
     * next display frame.</p>
     *
     * <p>This method can be invoked from outside of the UI thread
     * only when this View is attached to a window.</p>
     *
     * @see #invalidate()
     */
    public void postInvalidateOnAnimation() {
        // We try only with the AttachInfo because there's no point in invalidating
        // if we are not attached to our window
        final AttachInfo attachInfo = mAttachInfo;
        if (attachInfo != null) {
            attachInfo.mViewRootImpl.dispatchInvalidateOnAnimation(this);
        }
    }

从注释中得知会最终调用invalidate方法

最终会调用 android.view.ViewRootImpl.performTraversals()



明天继续 奋斗





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值