[英]How do I trigger the redraw of a parent View when any of it's children are redrawn?
我已经编写了一个基于LinearLayout
的自定义Android视图,我称之为ReflectingLayout
。 这个想法非常简单,在ReflectingLayout
声明的任何子视图下面呈现反射效果。 例如..
我通过覆盖ReflectingLayout
dispatchDraw()
来实现这一目的,如下所示:
@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);
}
如果我的ReflectingLayout
包含,比如说,一个TextView
,我改变的文本内容TextView
反射效果没有更新。
我相信这是因为Android只会重绘TextView
本身而不是所有父视图,这意味着我的重写dispatchDraw()
方法不会被调用。
是否有任何简单的方法可以触发重绘父视图以响应其中任何子视图的更改?
特别是,当重新绘制子视图时,如何重绘我的ReflectingLayout
?
我注意到在API级别11中添加了一个新的View.OnLayoutChangeListener
。据推测,这可以用于将回调注册到父视图并触发重绘(?)。 无论如何,我需要一个适用于API Level 7以上的解决方案。
我可以简单地扩展TextView
和我想在ReflectingLayout
声明的任何其他View类,以便在重绘它们时使它们的父项无效,但这是一个笨重的解决方案。
任何帮助都很受欢迎(包括你认为整体方法是错误的)。
谢谢。
在视图中使用getParent()
方法怎么样? 像这样的东西:
if (getParent() instanceof View)
((View) getParent()).invalidate();
我刚遇到这个问题。 我发现这是由于3.0+中的新硬件加速支持。我解决它的方式是使用View#setLayerType
并使用LAYER_TYPE_SOFTWARE
。 为了继续针对API级别8我使用反射来调用此方法来支持Android平台。 这解决了这个问题,现在我的自定义ViewGroup在子项无效时正确绘制。
我不知道这是否能完全解决你的问题,但它可能会帮助那些也被这个问题困扰的人。
反思代码,很基本:
try {
Method method =
CustomViewGroup.class.getMethod("setLayerType", new Class[] { Integer.TYPE, Paint.class });
// 0x1 == LAYER_TYPE_SOFTWARE
method.invoke(this, new Object[] { Integer.valueOf(0x1), null });
} catch(SecurityException e) {
Log.e(TAG, "reflectSetLayerType", e);
} catch(NoSuchMethodException e) { // don't care
} catch(IllegalArgumentException e) {
Log.e(TAG, "reflectSetLayerType", e);
} catch(IllegalAccessException e) {
Log.e(TAG, "reflectSetLayerType", e);
} catch(InvocationTargetException e) {
Log.e(TAG, "reflectSetLayerType", e);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.