首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android:隐藏视图和onDraw()事件

Android:隐藏视图和onDraw()事件
EN

Stack Overflow用户
提问于 2014-11-19 21:55:08
回答 2查看 2.3K关注 0票数 0

每次需要重新绘制onDraw()时都会发出事件View,导致内部发生一些图形更改。

不幸的是,如果View是隐藏的(不可见的),则不会发出此事件,因为很明显,没有必要重新编写任何内容。但是,我想知道是否存在一些“欺骗”View以发出onDraw()事件并重新绘制自身的技巧,就像它在屏幕中显示的那样。

基本上,我需要捕捉View组件在其所有更改中的屏幕快照状态,但是白屏显示它(在后台运行它)。

我想很难得到这样的结果,但为了以防万一,我会尽力去问。

谢谢

EN

回答 2

Stack Overflow用户

发布于 2014-11-19 22:04:38

我相信,View的可见性是由它的母公司而不是View本身检查的。你可以将一个由Bitmap支持的Canvas直接传递给View#draw(Canvas canvas),它会把自己拉到位图上。然而,根据View#setVisibility()的源代码,视图的背景仍然是不可见的。

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

其他一切都应该以原样出现在视图中(当然,除非它的子元素也设置为不可见)。

编辑:

Converting a view to Bitmap without displaying it in Android?

关于如何做到这一点,有一些例子。

代码语言:javascript
运行
复制
public static Bitmap getBitmapFromView(View view) {
    Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(returnedBitmap);
    view.draw(canvas);
    return returnedBitmap;
}

编辑2:

因为setVisibility()不是视图的一部分,所以您可以重写它,而不是将视图设置为不可见。类似于:

代码语言:javascript
运行
复制
   boolean isInvisible = false;

   @Override
   public void setVisibility(int visibility) {
       if (visibility == View.INVISIBLE) {
           invisible = true;
       } else {
           invisible = false;
           super.setVisibility();
       }
   }

   @Override
   public void onDraw(Canvas canvas) {
       // change state code
       if (!invisible) {
           // draw code
           super.onDraw(canvas);
       }
   }

   @Override
   public void draw(Canvas canvas) {
      if (!invisible) {
          // draw code
          super.draw(canvas);
      }
   }

我不知道这会产生什么副作用,所以要非常小心和疲倦。也许其他人会有更好的解决方案。另一个解决方案是,只要您想要绘制onDraw(),就可以在不同的画布上调用它。这将要求您创建一个超类,它是要绘制的视图的父级布局视图。然后,在父类的onDraw()方法中,如果子onDraw()方法的可见性设置为不可见,则分别调用它。

票数 0
EN

Stack Overflow用户

发布于 2015-02-04 07:51:00

如果有人感兴趣,我设法通过覆盖失效()方法来解决这个问题。只有当视图当前可见时,系统才会调用onDraw(),相反,该函数被调用为“内部”,并可用于检查视图是否需要以相同的方式被引用。

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

https://stackoverflow.com/questions/27027773

复制
相关文章

相似问题

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