android内置的ProgressBar控件裡不少的方法充斥着交叉的synchronized鎖。很多時候刷進度導緻ProgressBar顯示不出來,也沒見哪裡設定隐藏的,估計是鎖導緻的,浪費時間看源碼。android ui的更新本來就限制死在ui線程裡,亂加神碼鎖,腦殘!解決問題隻能自己畫進度條了。
UI元素比較簡單,不需要動畫、SecondaryProgress,是以可以簡單的按照進度百分比設定一個Drawable的寬度再畫在view視圖上。實作好後也沒發現神碼問題,版本上了一段時間偶然才在一台2.3 系統裝置上發現所有的進度條是100%的。調試了很長時間,進度、寬度計算都是沒有問題的。找來2.3 ColorDrawable的源碼才發現它的實作是畫滿屏寬的。又是個坑,高歌猛進的android挖了多少坑啊。相容的解決的方法是在繪制時同時用canvas的clipRect方法設定繪制區域即可。
mBounds.set(0, 0, width, getMeasuredHeight());
mDrawable.setBounds(mBounds);
canvas.clipRect(mBounds);
mDrawable.draw(canvas);