Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 關於Android View與Drawable的問題

關於Android View與Drawable的問題

編輯:關於Android編程

問題描述:

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

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved