關於Android View與Drawable的問題

問題描述:

調用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"

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。