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



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

不幸的是,如果View是隐藏的(不可见的),则不会发出此事件,因为显然,不需要重新痛苦任何东西。但是,我会知道是否有一些技巧可以"欺骗"View以发出onDraw()事件并重新绘制自己,就像它在屏幕内真正显示的那样。

基本上,我需要捕获View组件的所有更改的屏幕截图状态,但显示它(在后台运行它)。

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

谢谢

我相信View可见性是由它的父级而不是View本身检查的。 您可以将由Bitmap支持的Canvas直接传递到View#draw(Canvas canvas),它将自身绘制到位图上。 但是,基于View#setVisibility()的源代码,视图的背景仍将是不可见的。

public void setVisibility(int visibility) {
  setFlags(visibility, VISIBILITY_MASK);
  if (mBGDrawable != null) mBGDrawable.setVisible(visibility == VISIBLE, false);
}

其他所有内容都应按原样显示在视图中(当然,除非它的子项也设置为不可见)。

编辑:

将视图转换为位图而不在 Android 中显示?

那里有关于如何做到这一点的例子。

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()不是视图的一部分,因此您可以覆盖它,并且只是不将视图设置为不可见。 像这样:

   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() 方法中,如果子项的可见性设置为不可见,则单独调用该方法。

如果有人感兴趣,我设法通过覆盖 invalidate() 方法解决了这个问题。与仅在视图当前可见时才由系统调用的 onDraw() 不同,invalidate() 函数被称为"内部",可用于检查是否需要以相同的方式重新获取视图。

最新更新