天天记录 - Android invalidate流程方法调用堆栈分析





分析点击按钮导致背景切换,其中invalidate流程分析






一 先看下之前从打印LOG的方法感性的认识Invalidate流程

Android invalidate流程分析-图文


View  invalidateDrawable(Drawable drawable)
View  invalidate , l = 0 , t = 0 , r = 90 , b = 90
LinearLayout  invalidateChildInParent Rect Left = 0, right = 90, top = 0, bottom = 90
RelativeLayout  invalidateChildInParent Rect Left = 55, right = 145, top = 55, bottom = 145


    之前是先感性认识,从打出的log查看invalidate调用流程,这些log都是Android提供的回调方法中输出LOG,如果invalidate流程中有私有方法,就肯定跟踪不到。
所以现在从源码的角度来分析此流程。




二 大致从源码的调用角度分析Invalidate流程,了解些细节

Android 使用dmeo和源码分析invalidate流程


三  Invalidate流程引发的疑惑

Andorid Invalidate 引发的思考



四 当前使用方法调用堆栈的方法分析invalidate流程

    

    分析源码要有一个开始的地方,从之前输出LOG来看第一个执行invalidateDrawable,执行的整体流程中,肯定是先触发onTouchEvent,

这里不分析整个流程仅仅先通过方法调用堆栈跟踪下Invalidate流程

先后顺序类名最终执行方法
1InvalidateViewView.invalidateDrawable(Drawable drawable)
2InvalidateViewView.invalidate(int l, int t, int r, int b)
3InvalidateLinearLayoutViewGroup.invalidateChild(View child, final Rect dirty)
4InvalidateLinearLayoutViewGroup.invalidateChildInParent(int[] location, Rect r)
5InvalidateRelativeLayoutViewGroup.invalidateChildInParent(int[] location, Rect r)
6ViewRootImplViewRootImpl.invalidateChildInParent(final int[] location, final Rect dirty)
7同上ViewRootImpl.invalidateChild(View child, Rect dirty)
8同上ViewRootImpl.scheduleTraversals()
9同上ViewRootImpl.performTraversals()
10 onMeasure, onLayout,onDraw



其中向上传递最重要的就是4,5,6三个步骤,其调用层级关系在ViewGroup.invalidateChild方法中处理

    public final void invalidateChild(View child, final Rect dirty) {
    	// parent初始值是当前ViewGroup自身
        ViewParent parent = this;

        ......

        do {
            View view = null;
            if (parent instanceof View) {
                view = (View) parent;
            }

            ......
            // 返回当前ViewGroup的父视图的调用
            parent = parent.invalidateChildInParent(location, dirty);
            
            ......
			
        } while (parent != null); // 循环
    }	




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值