设为首页 加入收藏

TOP

Android View 的刷新机制
2014-11-24 11:50:20 来源: 作者: 【 】 浏览:0
Tags:Android View 新机制

感想就是自己要多阅读android的源代码,其实很多的消息传递等等的机制,都是通过阅读android的源代码得到的,所以有事没事就去看源代码玩吧~


好了,来到正题,关键的一句话就是:


在Android的布局体系中,父View负责刷新、布局显示子View;而当子View需要刷新时,则是通知父View来完成。


步骤就是:


1、调用子View的invalidate()


2、跳转到上一层的invalidateChild函数中区


3、在一次调用invalidateChildInParent的函数一次层层刷新


4、具体的刷新后续操作,我就不清楚了,调用invalidate最终在代码上就在invalidateChild终止了的,所以表示有点点不清晰,求各位大牛介绍一下吧。。。。。?在此谢过了。。


让我来阅读源代码:


首先在View类中:


/**
* Invalidate the whole view. If the view is visible, {@link #onDraw} will
* be called at some point in the future. This must be called from a
* UI thread. To call from a non-UI thread, call {@link #postInvalidate()}.
*/
public void invalidate() {
if (ViewDebug.TRACE_HIERARCHY) {
ViewDebug.trace(this, ViewDebug.HierarchyTraceType.INVALIDATE);
}


if ((mPrivateFlags & (DRAWN | HAS_BOUNDS)) == (DRAWN | HAS_BOUNDS)) {
mPrivateFlags &= ~DRAWN & ~DRAWING_CACHE_VALID;


final ViewParent p = mParent; //获得父类View的对象
final AttachInfo ai = mAttachInfo;//获得匹配
if (p != null && ai != null) {
final Rect r = ai.mTmpInvalRect;
r.set(0, 0, mRight - mLeft, mBottom - mTop);//设置本View的尺寸,其实就是大小没有设置位置


// Don't call invalidate -- we don't want to internally scroll
// our own bounds
p.invalidateChild(this, r); //调用父类的刷新函数
}
}
}


下面我们来到Viewgroup对象:


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android应用ANR事件分析指导 下一篇Android如何在Java代码中设置marg..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Bash 脚本教程——Li (2025-12-26 07:53:35)
·实战篇!Linux shell (2025-12-26 07:53:32)
·整理了250个shell脚 (2025-12-26 07:53:29)
·HyperText Transfer (2025-12-26 07:20:48)
·半小时搞懂 HTTP、HT (2025-12-26 07:20:42)