invalidate()函数啥功能及源代码
时间: 2023-12-06 08:05:43 浏览: 32
在Android中,invalidate()函数是View类中的一个方法,它用于告诉系统当前的视图已经失效,需要重新绘制。当我们需要更新UI界面时,我们可以调用该方法。
invalidate()方法的源代码如下:
```java
public void invalidate() {
invalidate(true);
}
public void invalidate(boolean invalidateCache) {
if (ViewDebug.TRACE_HIERARCHY) {
ViewDebug.trace(this, ViewDebug.HierarchyTraceType.INVALIDATE);
}
if ((mPrivateFlags & PFLAG_INVALIDATED) == PFLAG_INVALIDATED) {
return;
}
// ...
mPrivateFlags |= PFLAG_DRAWN | PFLAG_INVALIDATED;
final AttachInfo ai = mAttachInfo;
if (ai != null && ai.mHardwareAccelerated) {
// ...
} else {
final ViewParent p = mParent;
final Rect damage = ai != null ? ai.mTmpInvalRect : new Rect();
if (p != null && width > 0 && height > 0) {
damage.set(0, 0, width, height);
p.invalidateChild(this, damage);
}
}
}
```
invalidate()方法有一个重载方法invalidate(boolean invalidateCache),当传入参数invalidateCache为true时,会同时清除缓存。在方法内部,首先会判断当前视图是否已经失效(即是否已经调用过invalidate()方法),如果已经失效,则直接返回。
接着会将标志位设置为PFLAG_DRAWN | PFLAG_INVALIDATED,表示当前视图需要重新绘制。
如果当前视图开启了硬件加速,则会执行一些与硬件加速相关的操作;否则,会通过mParent(即当前视图的父视图)调用invalidateChild()方法,通知父视图当前视图需要重新绘制。同时,会将需要更新的矩形区域damage传递给父视图,以便父视图知道哪些区域需要重新绘制。