目的:實現android window里的View動畫
實現:View動畫一般情況下首先考慮的就是Tween(補間)、Frame(幀)動畫,和api11后才支持的屬性動畫(ValueAnimator)。但是若是要實現簡單的自定義繪制然后刷新的動畫,以上方法就不適用,本文僅討論自定義畫筆繪制的刷新動畫。
用到的方法就是自定義類繼承View,重寫onDraw方法,用postInvalidateDelayed延時通知UI線程invalidate(),然后實現動畫。
步驟:
1. 自定義類繼承View
class MyDrawView extends View{
...
// 定義一個開關量
protected boolean bePlay = false;
protected float progress = 0f; //進度值,此處定義為0f~1f
// 重寫onDraw
@Override
onDraw(){
if(bePlay){
// 用paint在Canvas上,畫自己需要的簡單圖形,當然也可以結合Bitmap取圖片變形等。
// progress賦下一次的進度值
if(progress<=1f){
this.postInvalidateDelayed(10); // 延時10ms,此部分自己控制
}else{
progress = 0f;
bePlay = false;
}
}
}
...
}
2. 在需要用到的地方,創建該View。
public MyLayout extends ViewGroup {
onFinishInflate(){
myDrawView = new MyDrawView(); //創建MyDrawView對象
}
某調用方法() {
myDrawView.bePlay = true;
// 可加入progress的自定制語句
myDrawView.invalidate(); //該處就調用了onDraw方法,由此就啟動刷新動畫。
}
}
自此可用Java代碼來繪制View的刷新動畫,但是效率方面還是有待考量的。希望能幫到大家。
補充說下筆者之前實現遇到的問題:
之前筆者在ui線程中使用類似循環判斷進度值的方法,不斷invalidate() 或在非UI線程循環postInvalidate() .導致的結果就是只能顯示最后一次的invalidate效果。后來筆者用按鈕來驅動一幀一幀刷新invalidate,就可以間斷實現。
筆者判斷UI線程需要在空閑的時候才能處理invalidate返回的繪制結果,從而刷新View。若UI線程一直被占用則無法處理,故上文中才使用postInvalidateDelayed(哪怕只有1ms)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。