溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

View的刷新動畫實現

發布時間:2020-07-31 17:48:11 來源:網絡 閱讀:795 作者:cfy10 欄目:開發技術

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女