問題描述:
調用View.invalidate()方法,就會請求View重新draw()。可是我看了invalidate()與相關的方法,並沒有與draw()有直接的關係。請問invalidate()是如何使View重新draw()的?
Drawable.mutate()方法為了不產生新的對象,直接返回了它自身。既然是這樣,那為什麼mutate()以後同一個映像資源能夠有不同的常態(比如透明度)?在BitmapDrawable中在第一次mutate()的時候新產生一個BitmapState常態,後面的就是直接返回它自身了。第一次常態對象改變了倒還可以理解,可後面的我就不明白了。求高人解惑,非常感謝!
解決方案:
1:invalidate重新整理原理比較複雜
invaliddate=>父view=>Handler=>performTraversals()=>draw()=>onDraw();
[java]
/* ============================detail====================================
其繼承的父views cheduleTraversals()方法向Handler發送訊息
viewRoot 處理其訊息
case DO_TRAVERSAL:
performTraversals();
performTraversals()方法,調用private void draw(boolean fullRedrawNeeded)
其中含有
mView.draw(canvas);
接著
if (!dirtyOpaque) onDraw(canvas);
*/
/* ============================detail====================================
其繼承的父views cheduleTraversals()方法向Handler發送訊息
viewRoot 處理其訊息
case DO_TRAVERSAL:
performTraversals();
performTraversals()方法,調用private void draw(boolean fullRedrawNeeded)
其中含有
mView.draw(canvas);
接著
if (!dirtyOpaque) onDraw(canvas);
*/
2:不是為了省記憶體,恰恰相反,原生的drawable是共用部份資料才是省記憶體
其中共用部分就是constant state(常態)
你想啊,N張圖片用一個常態,我若想改這個值,如Alpha那麼所有圖片都變了,就像
變數static變數一樣了
而使用mutate以後,會複製constant state,drawable還是共用的,這也算是解決了低於1.5版本的一個"bug"