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