[英]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.