Android:隐藏View和onDraw()事件

时间:2014-11-19 21:55:08

标签: android

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

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

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

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

谢谢

2 个答案:

答案 0 :(得分:0)

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

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?

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

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()方法中,如果它的可见性设置为INVISIBLE,则分别调用子的onDraw()方法。

答案 1 :(得分:0)

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