我正在试图为我的自定义视图找出优化。我想知道,对View.setVisibility(View.VISIBLE)的调用是否强制Android框架更新视图可见性(<-强制视图重绘),即使视图已经可见。
发布于 2013-09-30 15:48:41
不,不是的。
看看setVisibility()
public void setVisibility(int visibility) {
setFlags(visibility, VISIBILITY_MASK);
if (mBGDrawable != null) mBGDrawable.setVisible(visibility == VISIBLE, false);
}它只调用setFlags(),如果没有任何变化,它会立即返回:
....
int changed = mViewFlags ^ old;
if (changed == 0) {
return;
}即使它(不知怎么地)经过了那里,它也会检查单个标志是否正在变化,并且只有当其中一个标志与以前不同时才进行更新。
发布于 2013-09-30 15:50:31
public void setVisibility(int visibility) {
setFlags(visibility, VISIBILITY_MASK);
if (mBackground != null) mBackground.setVisible(visibility == VISIBLE, false);
}setFlags(...)方法的开头是:
int old = mViewFlags;
mViewFlags = (mViewFlags & ~mask) | (flags & mask);
int changed = mViewFlags ^ old;
if (changed == 0) {
return;
}所以我很肯定这个方法什么也做不了。否则,它会做很多事情,除了触发布局和重绘。
public boolean setVisible(boolean visible, boolean restart) {
boolean changed = mVisible != visible;
if (changed) {
mVisible = visible;
invalidateSelf();
}
return changed;
}if将是错误的,因此不会做任何事情。
然而,View#setVisible()被ImageView、MediaRouteButton、ProgressBar、SurfaceView和ViewStub覆盖。您需要检查每个实现,如果它做了其他任何事情--您可能正在使用这些子类中的一个。
Drawable也是如此:有8个类覆盖Drawable#setVisible(boolean, boolean)
根据您的组合,您可能会发现您实际上是在做一些额外的事情,因此您需要研究您正在使用的是哪种View,以及它的背景图是什么样的可绘制的。
发布于 2013-09-30 15:47:31
setVisibility()通过调用内部的setFlags设置视图标志。如果我们进入sdk,View.setFlags(),我们可以看到,如果标志状态没有改变,这个方法就什么也做不了。sdk View.setFlags()方法中的代码:int changed = mViewFlags ^ old; if (changed == 0) { return; }
https://stackoverflow.com/questions/19098217
复制相似问题