程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> drawable-關於Android View與Drawable的問題,求高人解惑

drawable-關於Android View與Drawable的問題,求高人解惑

編輯:編程綜合問答
關於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();

/* ============================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 © 程式師世界 All Rights Reserved