首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >View.setVisibility(View.VISIBLE)是否强制视图重新绘制,即使它已经可见?

View.setVisibility(View.VISIBLE)是否强制视图重新绘制,即使它已经可见?
EN

Stack Overflow用户
提问于 2013-09-30 15:35:26
回答 4查看 1.6K关注 0票数 4

我正在试图为我的自定义视图找出优化。我想知道,对View.setVisibility(View.VISIBLE)的调用是否强制Android框架更新视图可见性(<-强制视图重绘),即使视图已经可见。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-09-30 15:48:41

不,不是的。

看看setVisibility()

代码语言:javascript
复制
public void setVisibility(int visibility) {
    setFlags(visibility, VISIBILITY_MASK);
    if (mBGDrawable != null) mBGDrawable.setVisible(visibility == VISIBLE, false);
}

它只调用setFlags(),如果没有任何变化,它会立即返回:

代码语言:javascript
复制
....
int changed = mViewFlags ^ old;
if (changed == 0) {
    return;
}

即使它(不知怎么地)经过了那里,它也会检查单个标志是否正在变化,并且只有当其中一个标志与以前不同时才进行更新。

票数 7
EN

Stack Overflow用户

发布于 2013-09-30 15:50:31

View#setVisibility里看

代码语言:javascript
复制
public void setVisibility(int visibility) {
    setFlags(visibility, VISIBILITY_MASK);
    if (mBackground != null) mBackground.setVisible(visibility == VISIBLE, false);
}

setFlags(...)方法的开头是:

代码语言:javascript
复制
int old = mViewFlags;
mViewFlags = (mViewFlags & ~mask) | (flags & mask);

int changed = mViewFlags ^ old;
if (changed == 0) {
    return;
}

所以我很肯定这个方法什么也做不了。否则,它会做很多事情,除了触发布局和重绘。

Background#setVisible类似于:

代码语言:javascript
复制
public boolean setVisible(boolean visible, boolean restart) {
    boolean changed = mVisible != visible;
    if (changed) {
        mVisible = visible;
        invalidateSelf();
    }
    return changed;
}

if将是错误的,因此不会做任何事情。

然而,View#setVisible()ImageViewMediaRouteButtonProgressBarSurfaceViewViewStub覆盖。您需要检查每个实现,如果它做了其他任何事情--您可能正在使用这些子类中的一个。

Drawable也是如此:有8个类覆盖Drawable#setVisible(boolean, boolean)

  1. ClipDrawable
  2. DrawableContainer
  3. AnimationDrawable -从DrawableContainer扩展
  4. InsetDrawable
  5. LayerDrawable
  6. RotateDrawble
  7. ScaleDrawable
  8. SlideDrawable

根据您的组合,您可能会发现您实际上是在做一些额外的事情,因此您需要研究您正在使用的是哪种View,以及它的背景图是什么样的可绘制的。

票数 3
EN

Stack Overflow用户

发布于 2013-09-30 15:47:31

setVisibility()通过调用内部的setFlags设置视图标志。如果我们进入sdk,View.setFlags(),我们可以看到,如果标志状态没有改变,这个方法就什么也做不了。sdk View.setFlags()方法中的代码:int changed = mViewFlags ^ old; if (changed == 0) { return; }

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19098217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档