invalidate()和requestLayout()方法调用过程

在上一篇博客中我们开始就提到了两组方法,其中scrollTo()和scrollBy()在上一篇博客中已经说的比较详细了,但是对于另一组invalidate()系列的方法只是说明他们重新调用draw方法绘制界面,并没有说明他们究竟是怎样一步一步实现对界面进行重绘的。在这篇博客中就为大家分析一下invalidate()系列方法重绘界面的过程,同时也说明另一个在自定义控件中会用到而且和的方法invalidate()相似的方法requestLayout()方法。

首先看到invalidate()方法,不管我们是自定义继承至View还是继承至ViewGroup的控件,invalidate()方法都是调用的View类中的,查看invalidate()方法源码:

public void invalidate() {
	invalidate(true);
}
接着查看:
// 参数表示是否跳过无效的步骤
// 如果一个控件的大小和内容都未发生改变,可以设置为false的表示跳过无效步骤
// 使用了默认修饰符,只有同一个包下的才可以调用,在不同包中即使是子类也不可以调用,所以开发者不能调用
void invalidate(boolean invalidateCache) {
	invalidateInternal(0, 0, mRight - mLeft, mBottom - mTop, invalidateCache, true);
}
接着查看invalidateInternal()方法的代码:
void invalidateInternal(int l, int t, int r, int b, boolean invalidateCache,
		boolean fullInvalidate) {
	if (mGhostView != null) {
		mGhostView.invalidate(true);
		return;
	}

	// 判断是否需要跳过重新绘制,
	// 当需要重绘的控件是不可见的并且没有运行一个动画,就不需要重新绘制
	if (skipInvalidate()) {
		return;
	}

	if ((mPrivateFlags & (PFLAG_DRAWN | PFLAG_HAS_BOUNDS)) == (PFLAG_DRAWN | PFLAG_HAS_BOUNDS)
			|| (invalidateCache && (mPrivateFlags & PFLAG_DRAWING_CACHE_VALID) == PFLAG_DRAWING_CACHE_VALID)
			|| (mPrivateFlags & PFLAG_INVALIDATED) != PFLAG_INVALIDATED
			|| (fullInvalidate && isOpaque() != mLastIsOpaque)) {
		// 是否全部重绘
		if (fullInvalidate) {
			mLastIsOpaque = isOpaque();
			mPrivateFlags &= ~PFLAG_DRAWN;
		}

		mPrivateFlags |= PFLAG_DIRTY;
		
		// 是否跳过无效的步骤
		if (invalidateCache) {
			mPrivateFlags |= PFLAG_INVALIDATED;
			mPrivateFlags &= ~PFLAG_DRAWING_CACHE_VALID;
		}

		// Propagate th
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值