溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

View的刷新動(dòng)畫實(shí)現(xiàn)

發(fā)布時(shí)間:2020-07-31 17:48:11 來源:網(wǎng)絡(luò) 閱讀:759 作者:cfy10 欄目:開發(fā)技術(shù)

目的:實(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)

向AI問一下細(xì)節(jié)

免責(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)容。

AI