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

Android:隐藏视图和onDraw()事件,android,Android,每次需要重新绘制视图时,都会发出事件onDraw(),这会导致内部发生一些图形更改 不幸的是,如果视图隐藏(不可见),则不会发出此事件,因为显然不需要重新绑定任何内容。但是,我想知道是否有一些技巧可以“欺骗”视图以发出onDraw()事件,并完全按照屏幕中实际显示的方式重新绘制自身 基本上,我需要捕获视图组件在所有更改中的屏幕截图状态,但不显示(在后台运行) 我想很难得到这样的结果,但为了以防万一,我会尽量问 谢谢我相信视图的可见性是由其父视图检查的,而不是由视图本身检查的。您可以直接将画布通过

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

不幸的是,如果
视图
隐藏(不可见),则不会发出此事件,因为显然不需要重新绑定任何内容。但是,我想知道是否有一些技巧可以“欺骗”
视图
以发出
onDraw()
事件,并完全按照屏幕中实际显示的方式重新绘制自身

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

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

谢谢

我相信
视图的可见性是由其父视图检查的,而不是由
视图本身检查的。您可以直接将
画布
通过
位图
进入
视图#绘制(画布)
,它将自己绘制到位图上。但是,基于
视图的源代码#setVisibility()
,视图的背景仍然不可见

public void setVisibility(int visibility) {
  setFlags(visibility, VISIBILITY_MASK);
  if (mBGDrawable != null) mBGDrawable.setVisible(visibility == VISIBLE, false);
}
其他所有内容都应按原样显示在视图中(当然,除非其子项也设置为“不可见”)

编辑:

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

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

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

您好,谢谢您的回复。不幸的是,我的问题不是截图,我已经知道了获取截图的方法。我的问题是,如果视图内部发生了更改(其中有一个动态内容),则需要通过onDraw()得到“建议”。onDraw()是在视图需要在某些部分重新绘制时发出的,这允许我知道是否有更改,但在不可见状态下不会发出此事件。Ok。如果我没弄错的话,即使视图不可见,您也希望调用onDraw,因为视图的状态在绘图的每次迭代中都会发生变化,对吗?最好不要在onDraw()中更改视图状态,而是在它之外的其他地方更改。除此之外,您还可以重写
setVisibility()
,以捕获
不可见的
参数并自己使用它。我不知道那会有什么副作用。你很了解,但恰恰相反,我不理解你的建议。请注意,我需要隐藏视图,但同时,我需要视图按照显示的方式“工作”(而不是在内容重新绘制时生成onDraw()事件)。不幸的是,我想我的需要太奇怪了,无法实现…对。只需不在画布上绘制,即可隐藏视图。除此之外,你还可以做任何额外的工作。在视图中不调用onDraw()的原因是设置了不可见标志,这样父级就不用麻烦了。如果从未设置该标志,则父视图将继续绘制,但必须确保视图不会绘制自身。画布对象仅绘制为位图。绘制完所有视图后,位图将显示在屏幕上。如果有子视图也需要绘制(但仍然不可见),则您也需要调用它们的
onDraw()
方法,但要使用单独的画布,以便它们不在窗口提供的主画布上绘制。