如何在重绘任何子视图时触发父视图的重绘?

tom*_*nor 11 user-interface android android-widget android-layout

背景

我已根据LinearLayout我调用的内容编写了一个自定义Android视图ReflectingLayout.这个想法相当简单,在下面声明的任何子视图下面呈现反射效果ReflectingLayout.例如..

像这样的东西

我通过重写实现这一目标dispatchDraw()ReflectingLayout,如下所示:

@Override
protected void dispatchDraw(Canvas canvas) {

  Bitmap bitmap = Bitmap.createBitmap(...); 
  Canvas tempCanvas = new Canvas(bitmap);

  // Draw child views to bitmap using tempCanvas
  super.dispatchDraw(tempCanvas);

  ...
  // some tranformations performed on bitmap
  ...

  // draw transformed image on to main canvas
  canvas.drawBitmap(bitmap, 0, 0, null);
}
Run Code Online (Sandbox Code Playgroud)

问题

如果我ReflectingLayout包含,比方说,a TextView和我更改TextView了反射效果未更新的文本内容.

我相信这是因为Android只会重绘TextView自身而不是所有父视图,这意味着我的重写dispatchDraw()方法不会被调用.

是否有任何简单的方法可以触发重绘父视图以响应其中任何子视图的更改?

特别是,ReflectingLayout当重新绘制子视图时,如何重新绘制?

我已经考虑过的事情

  • 我注意到View.OnLayoutChangeListener在API级别11中添加了一个新的.据推测,这可以用于将回调注册到父视图并触发重绘(?).无论如何,我需要一个适用于API Level 7以上的解决方案.

  • 我可以简单地扩展TextView和我想要声明的任何其他View类,以便在ReflectingLayout重绘它们时使它们的父项无效,但这是一个笨重的解决方案.

任何帮助都很受欢迎(包括你认为整体方法是错误的).

谢谢.

An *_*Hoa 6

getParent()在您的视图中使用方法怎么样?像这样的东西:

if (getParent() instanceof View)
    ((View) getParent()).invalidate();
Run Code Online (Sandbox Code Playgroud)