1. 程式人生 > >自定義View(六)-動畫- AnimatorSet與XML設定屬性動畫

自定義View(六)-動畫- AnimatorSet與XML設定屬性動畫

介紹

AnimatorSet是組合動畫,前面在ObjectAnimator.ofPropertyValuesHolder(),時也可以做到控制多個屬性做動畫,但是.ofPropertyValuesHolder(),僅僅是將多個屬性同時做動畫卻無法靈活控制每個屬性的播放順序,針對的是一個控制元件,而AnimatorSet是組合動畫。更側重的是在多個動畫播放時對動畫的控制(可以控制動畫的順序,延時,同時可以控制多個控制元件的動畫等等)。

AnimatorSet

AnimatorSet針對ValueAnimator和ObjectAnimator都是適用的,但一般而言,我們不會用到ValueAnimator的組合動畫,所以我們僅講解ObjectAnimator下的組合動畫實現。

主要方法:
1. playSequentially :表示所有動畫依次播放
2. playTogether :表示所有動畫一起開始。

  • ##### playSequentially :

方法引數:

public void playSequentially(Animator... items);
public void playSequentially(List<Animator> items);

第一個是我們最常用的,它的引數是可變長引數,也就是說我們可以傳進去任意多個Animator物件。這些物件的動畫會逐個播放。第二個建構函式,是傳進去一個List< Animator>的列表。原理一樣,也是逐個去取List中的動畫物件,然後逐個播放。

使用:

·
  private void doPlaySequentiallyAnimator() {
        ObjectAnimator tv1BgAnimator = ObjectAnimator.ofInt(mTv1, "BackgroundColor", 0xffff00ff, 0xffffff00, 0xffff00ff);
        tv1BgAnimator.setEvaluator(new ArgbEvaluator());
        ObjectAnimator tv1TranslateY = ObjectAnimator.ofFloat(mTv1, "translationY"
, 0, 300, 0); ObjectAnimator tv2TranslateY = ObjectAnimator.ofFloat(mTv2, "translationY", 0, 300, 0); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.playSequentially(tv1BgAnimator, tv1TranslateY, tv2TranslateY); animatorSet.setDuration(1000); animatorSet.start(); }

當按鈕被點選時執行doPlaySequentiallyAnimator()方法。效果如下:
GIF11.gif
這就是playSequentially的效果,即逐個播放動畫,一個動畫結束後,播放下一個動畫,播放的順序就是傳入動畫的先後順序。(這裡也可以看出AnimatorSet是針對於動畫,並不管你在動畫是在哪個控制元件或是幾個控制元件,這就與.ofPropertyValuesHolder()不同)
- ##### playTogether :

playTogether表示將所有動畫一起播放 。

public void playTogether(Animator... items);
public void playTogether(Collection<Animator> items);

引數含義與上面一致。
程式碼:

animatorSet.playTogether(tv1BgAnimator, tv1TranslateY, tv2TranslateY);

其他程式碼去上面一致.效果:
GIF12.gif
此時三個動畫一起播放。
- ##### playSequentially,playTogether真正意義 :
- playTogether : 只是一個時間點上的一起開始,對於開始後,各個動畫怎麼操作就是他們自己的事了,至於各個動畫結不結束也是他們自已的事了。
- playSequentially : 意義是把啟用一個動畫之後,動畫之後的操作就是動畫自己來負責了,這個動畫結束之後,再啟用下一個動畫。如果上一個動畫沒有結束,那下一個動畫就永遠也不會被啟用。

首先用playTogether來看個例子:
GIF12.gif
將tv1TranslateY開始延遲2000毫秒開始,並設為無限迴圈。tv2TranslateY設為開始延遲2000毫秒。而tv1BgAnimator則是沒有任何設定,所以是預設直接開始。
從這個例子中也可以看到,playTogether只是負責在同一時間點一起開始,對於開始後,各個動畫怎麼操作就是他們自己的事了,至於各個動畫結不結束也是他們自已的事了。

將播放改成playSequentially順序播放動畫:

·
 private void doPlaySequentiallyAnimator2() {
        ObjectAnimator tv1BgAnimator = ObjectAnimator.ofInt(mTv1, "BackgroundColor", 0xffff00ff, 0xffffff00, 0xffff00ff);
        tv1BgAnimator.setEvaluator(new ArgbEvaluator());
        ObjectAnimator tv1TranslateY = ObjectAnimator.ofFloat(mTv1, "translationY", 0, 400, 0);
        tv1TranslateY.setRepeatCount(ValueAnimator.INFINITE);
        ObjectAnimator tv2TranslateY = ObjectAnimator.ofFloat(mTv2, "translationY", 0, 400, 0);

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.playSequentially(tv1BgAnimator, tv1TranslateY, tv2TranslateY);
        animatorSet.setDuration(2000);
        animatorSet.start();
    }

效果:

GIF13.gif

tv1BgAnimator顏色改變後移動,並設定成無限迴圈。那麼tv2TranslateY永遠無法得到執行。

總結:

- 第一:playTogether和playSequentially在啟用動畫後,控制元件的動畫情況與它們無關,他們只負責定時啟用控制元件動畫。
- 第二:playSequentially只有上一個控制元件做完動畫以後,才會啟用下一個控制元件的動畫,如果上一控制元件的動畫是無限迴圈,那下一個控制元件就別再指望能做動畫了。

AnimatorSet.Builder-自由設定動畫順序

上面兩種播放方法只能一起播放或者順序播放,無法指定某一個動畫的播放順序,如果想ABC三個動畫想指定C先播放就要用到AnimatorSet.Builder。
AnimatorSet.Builder可以更加靈活設定動畫播放的先後順序。
- AnimatorSet.Builder :

//呼叫AnimatorSet中的play方法是獲取AnimatorSet.Builder物件的唯一途徑
//表示要播放哪個動畫
public Builder play(Animator anim)
  • 更多方法 :
//和前面動畫一起執行
public Builder with(Animator anim)
//執行前面的動畫後才執行該動畫
public Builder before(Animator anim)
//執行先執行這個動畫再執行前面動畫
public Builder after(Animator anim)
//延遲n毫秒之後執行動畫
public Builder after(long delay)

注意: play(Animator anim)表示當前在播放哪個動畫,另外的with(Animator anim)、before(Animator anim)、after(Animator anim)都是以play中的當前所播放的動畫為基準的
例如: 當play(playAnim)與before(beforeAnim)共用,則表示在播放beforeAnim之前,先播放playAnim動畫;同樣,當play(playAnim)與after(afterAnim)共用時,則表示在播放afterAnim動畫之後,再播放playAnim動畫。
- 使用 :

方式一:使用builder物件逐個新增動畫

AnimatorSet.Builder builder = animatorSet.play(tv1TranslateY);
builder.with(tv2TranslateY);
builder.after(tv1BgAnimator);

方式二:序列方式

animatorSet.play(tv1TranslateY).with(tv2TranslateY).after(tv1BgAnimator);

如下:

ObjectAnimator tv1BgAnimator = ObjectAnimator.ofInt(mTv1, "BackgroundColor",  0xffff00ff, 0xffffff00, 0xffff00ff);
ObjectAnimator tv1TranslateY = ObjectAnimator.ofFloat(mTv1, "translationY", 0, 400, 0);
ObjectAnimator tv2TranslateY = ObjectAnimator.ofFloat(mTv2, "translationY", 0, 400, 0);

AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(tv1TranslateY).with(tv2TranslateY).after(tv1BgAnimator);
animatorSet.setDuration(2000);
animatorSet.start();

表示在tv1顏色變化後,兩個控制元件一同開始位移動畫:

GIF14.gif

AnimatorSet監聽器

因為ValueAnimator和AnimatorSet都派生自Animator類,而AnimatorListener是Animator類中的函式。所以都是使用相同的監聽:

/** 
 * 監聽器二:監聽動畫變化時四個狀態 
 */ 
public static interface AnimatorListener {
    /**
     * 當AnimatorSet開始時呼叫
     */
    void onAnimationStart(Animator animation);

    /**
     * 當AnimatorSet結束時呼叫
     */
    void onAnimationEnd(Animator animation);

    /**
     * 當AnimatorSet被取消時呼叫
     */
    void onAnimationCancel(Animator animation);

    /**
     * 當AnimatorSet重複時呼叫,由於AnimatorSet沒有設定repeat的函式,所以這個方法永遠不會被呼叫
     */
    void onAnimationRepeat(Animator animation);
}

//新增方法為:public void addListener(AnimatorListener listener)   
/** 
 * 監聽器三:監聽動畫暫停與重新開始
 */ 
public static interface AnimatorPauseListener {

        void onAnimationPause(Animator animation);
        void onAnimationResume(Animator animation);
    }
//新增方法為:public void addPasueListener(AnimatorPauseListener listener)

同時我們也可以傳入AnimatorListenerAdapter監聽器,他是一個抽象方法,裡面實現了Animator.AnimatorListener,Animator.AnimatorPauseListener介面,這樣我們可以只實現我們需要的方法。這裡我全部實現因為為了列印看出效果:

GIF16.gif

雖然我們的tv2TranslateY動畫在無限迴圈,但Log中沒有打印出對應的repeat的日誌,從日誌中也可以看出,AnimatorSet的監聽函式也只是用來監聽AnimatorSet的狀態的,與其中的動畫無關;

總結:

- AnimatorSet的監聽函式也只是用來監聽AnimatorSet的狀態的,與其中的動畫無關;
- AnimatorSet中沒有設定迴圈的函式,所以AnimatorSet監聽器中永遠無法執行到onAnimationRepeat()中!

AnimatorSet設定與單個動畫屬性衝突時

  • 常見衝突函式
//設定單次動畫時長
public AnimatorSet setDuration(long duration);
//設定加速器
public void setInterpolator(TimeInterpolator interpolator)
//設定ObjectAnimator動畫目標控制元件
public void setTarget(Object target)

這幾個函式在ObjectAnimator也存在,當單個動畫設定上面的屬性,同時組合動畫AnimatorSet也設定了相同的屬性。則遵循下面的規則:

**在AnimatorSet中設定以後,會覆蓋單個ObjectAnimator中的設定;即如果AnimatorSet中沒有設定,那麼就以ObjectAnimator中的設定為準。如果AnimatorSet中設定以後,ObjectAnimator中的設定就會無效。
**

例如:

1. 當單個動畫(ObjectAnimator)與組合動畫(AnimatorSet)同時設定setDuration(long duration)動畫時長,那麼所有單個動畫設定的時長失效。如果組合動畫(AnimatorSet)沒有設定setDuration(long duration)動畫時長,那麼會每個動畫會根據自己的時長做動畫。
2. 當單個動畫(ObjectAnimator)與組合動畫(AnimatorSet)同時設定setInterpolator,那麼所有單個動畫設定的加速器失效。如果組合動畫(AnimatorSet)沒有設定加速器,那麼會每個動畫會根據自己的加速器做動畫。

如下:

·
    private void doPlaySequentiallyAnimator4() {
        ObjectAnimator tv1TranslateY = ObjectAnimator.ofFloat(mTv1, "translationY", 0, 400, 0);
        tv1TranslateY.setDuration(50000000);
        tv1TranslateY.setInterpolator(new BounceInterpolator());

        ObjectAnimator tv2TranslateY = ObjectAnimator.ofFloat(mTv2, "translationY", 0, 400, 0);
        tv2TranslateY.setDuration(5000);
        tv2TranslateY.setInterpolator(new AccelerateDecelerateInterpolator());

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(2000);
        animatorSet.play(tv2TranslateY).with(tv1TranslateY);
        animatorSet.start();
    }

效果:
GIF17.gif
此時tv1TranslateY與tv2TranslateY都設定了時長同時AnimatorSet也設定了時長,發現只有animatorSet.setDuration(2000);生效,由於animatorSet沒有設定加速器,所有動畫執行各自的加速器。

3. AnimatorSet.setTarget()的作用就是將動畫的目標統一設定為當前控制元件,AnimatorSet中的所有動畫都將作用在所設定的target控制元件上

如下:

 ObjectAnimator tv1BgAnimator = ObjectAnimator.ofInt(mTv1, "BackgroundColor", 0xffff00ff, 0xffffff00, 0xffff00ff);
        ObjectAnimator tv2TranslateY = ObjectAnimator.ofFloat(mTv2, "translationY", 0, 400, 0);

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.playTogether(tv1BgAnimator,tv2TranslateY);
        animatorSet.setDuration(2000);
        animatorSet.setTarget(mTv2);
        animatorSet.start();

GIF18.gif

setStartDelay(long startDelay)

//設定延時開始動畫時長
public void setStartDelay(long startDelay)

當AnimatorSet所擁有的函式與單個動畫所擁有的函式衝突時,就以AnimatorSet設定為準。但唯一的例外就是setStartDelay。
setStartDelay函式不會覆蓋單個動畫的延時,而且僅針對性的延長AnimatorSet的啟用時間,單個動畫的所設定的setStartDelay仍對單個動畫起作用。
遵循原則:

- AnimatorSet的延時是僅針對性的延長AnimatorSet啟用時間的,對單個動畫的延時設定沒有影響。
- AnimatorSet真正啟用延時 = AnimatorSet.startDelay+第一個動畫.startDelay
- 在AnimatorSet啟用之後,第一個動畫絕對是會開始執行的,後面的動畫則根據自己是否延時自行處理。

XML實現屬性動畫

ValueAnimator、ObjectAnimator和AnimatorSet屬性動畫也可以在SML中設定。在res/animator/目錄下建立XML屬性動畫詳細可以參照
屬性動畫官方文件
下面只記錄簡單實用:
- Animator(ValueAnimator):

XML標籤含義:

<animator
    android:duration="int"
    android:valueFrom="float | int | color"
    android:valueTo="float | int | color"
    android:startOffset="int"
    android:repeatCount="int"
    android:repeatMode=["repeat" | "reverse"]
    android:valueType=["intType" | "floatType"]
    android:interpolator=["@android:interpolator/XXX"]/>
  • android:duration:每次動畫播放的時長
  • android:valueFrom:初始動化值;取值範圍為float,int和color,如果取值為float對應的值樣式應該為89.0,取值為Int時,對應的值樣式為:89;當取值為clolor時,對應的值樣式為 #333333;
  • android:valueTo:動畫結束值;取值範圍同樣是float,int和color這三種類型的值;
  • android:startOffset:動畫啟用延時;對應程式碼中的startDelay(long delay)函式;
  • android:repeatCount:動畫重複次數
  • android:repeatMode:動畫重複模式,取值為repeat和reverse;repeat表示正序重播,reverse表示倒序重播
  • android:valueType:表示引數值型別,取值為intType和floatType;與android:valueFrom、android:valueTo相對應。如果這裡的取值為intType,那麼android:valueFrom、android:valueTo的值也就要對應的是int型別的數值。如果這裡的數值是floatType,那麼android:valueFrom、android:valueTo的值也要對應的設定為float型別的值。非常注意的是,如果android:valueFrom、android:valueTo的值設定為color型別的值,那麼不需要設定這個引數;
  • android:interpolator:設定加速器;有關係統加速器所對應的xml值對照表如下:
    image

XML:

<?xml version="1.0" encoding="utf-8"?>
<animator xmlns:android="http://schemas.android.com/apk/res/android"
          android:duration="1000"
          android:interpolator="@android:anim/bounce_interpolator"
          android:valueFrom="0"
          android:valueType="intType"
          android:valueTo="300">
</animator>

程式碼:

ValueAnimator valueAnimator= (ValueAnimator) AnimatorInflater.loadAnimator(this,R.animator.animator);
                valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator valueAnimator) {
                        int value= (int) valueAnimator.getAnimatedValue();
                        tv_text.layout(value,value,tv_text.getWidth()+value,tv_text.getHeight()+value);
                    }
                });
                valueAnimator.start();

效果:
GIF19.gif
- objectAnimator(ObjectAnimator):

<objectAnimator
    android:propertyName="string"
    android:duration="int"
    android:valueFrom="float | int | color"
    android:valueTo="float | int | color"
    android:startOffset="int"
    android:repeatCount="int"
    android:repeatMode=["repeat" | "reverse"]
    android:valueType=["intType" | "floatType"]
    android:interpolator=["@android:interpolator/XXX"]/>

引數:

  • android:propertyName:對應屬性名,即ObjectAnimator所需要操作的屬性名。
    其它欄位的意義與animator的意義與取值是一樣的,下面再重新列舉一下。
  • android:duration:每次動畫播放的時長
  • android:valueFrom:初始動化值;取值範圍為float,int和color;
  • android:valueTo:動畫結束值;取值範圍同樣是float,int和color這三種類型的值;
  • android:startOffset:動畫啟用延時;對應程式碼中的startDelay(long delay)函式;
  • android:repeatCount:動畫重複次數
  • android:repeatMode:動畫重複模式,取值為repeat和reverse;repeat表示正序重播,reverse表示倒序重播
  • android:valueType:表示引數值型別,取值為intType和floatType;與android:valueFrom、android:valueTo相對應。如果這裡的取值為intType,那麼android:valueFrom、android:valueTo的值也就要對應的是int型別的數值。如果這裡的數值是floatType,那麼android:valueFrom、android:valueTo的值也要對應的設定為float型別的值。非常注意的是,如果android:valueFrom、android:valueTo的值設定為color型別的值,那麼不需要設定這個引數;
  • android:interpolator:設定加速器;

XML:

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
                android:propertyName="TranslationY"
                android:duration="2000"
                android:valueFrom="0.0"
                android:valueTo="400.0"
                android:interpolator="@android:anim/accelerate_interpolator"
                android:valueType="floatType"
                android:repeatCount="1"
                android:repeatMode="reverse"
                android:startOffset="2000"
    >
</objectAnimator>

程式碼:

 ObjectAnimator objectAnimator= (ObjectAnimator) AnimatorInflater.loadAnimator(this,R.animator.objectanimator);
                objectAnimator.setTarget(tv_text);
                objectAnimator.start();

效果:

GIF20.gif

  • ObjectAnimator設定背景顏色:

XML:

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
                android:propertyName="BackgroundColor"
                android:duration="5000"
                android:valueFrom="#ffff00ff"
                android:valueTo="#ffffff00"/>

程式碼:

ObjectAnimator objectAnimator= (ObjectAnimator) AnimatorInflater.loadAnimator(this,R.animator.animatorcolor);
        objectAnimator.setTarget(mTv1);
        objectAnimator.start();

效果:

GIF.gif

  • Set(AnimatorSet):
    XML:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="together">
    <objectAnimator
        android:propertyName="x"
        android:duration="500"
        android:valueFrom="0"
        android:valueTo="400"
        android:valueType="floatType"/>
    <objectAnimator
        android:propertyName="y"
        android:duration="500"
        android:valueFrom="0"
        android:valueTo="300"
        android:valueType="floatType"/>
</set>
<!--這裡有兩個objectAnimator動畫,一個改變值x座標,一個改變值y座標;取值分別為0-400和0-300;然後在程式碼中載入-->

程式碼:

 ObjectAnimator objectAnimator= (ObjectAnimator) AnimatorInflater.loadAnimator(this,R.animator.animatorcolor);
        objectAnimator.setEvaluator(new ArgbEvaluator());
        objectAnimator.setTarget(mTv1);
        objectAnimator.start();

效果:
GIF.gif

更多動畫

  • LayoutAnimation : viewGroup新增進入統一動畫的
  • gridLayoutAnimation : grideView新增進入動畫的
  • android:animateLayoutChanges屬性 : 在API 11之後,Android為了支援ViewGroup類控制元件,在新增和移除其中控制元件時自動新增動畫,為我們提供了一個非常簡單的屬性:android:animateLayoutChanges=[true/false],所有派生自ViewGroup的控制元件都具有此屬性,只要在XML中新增上這個屬性,就能實現新增/刪除其中控制元件時,帶有預設動畫了。
  • LayoutTransaction 對animateLayoutChanges屬性的擴充套件,可以使用自定義刪除/新增動畫。

結語

到此動畫部分到此結束。後期根據自身的理解如果學習到了新得關於動畫的知識會繼續記錄動畫相關的知識點。這是本人的學習筆記。十分感謝啟航大神。也希望大家多多支援。下篇文章將會講解Acitvity啟動佈局的載入。

感謝

相關推薦

定義View()-動畫- AnimatorSetXML設定屬性動畫

介紹 AnimatorSet是組合動畫,前面在ObjectAnimator.ofPropertyValuesHolder(),時也可以做到控制多個屬性做動畫,但是.ofPropertyValuesHolder(),僅僅是將多個屬性同時做動畫卻無法靈活控制每個屬

安卓定義View進階-分類流程

本章節為什麼要叫進階篇?(雖然講的是基礎內容),因為從本篇開始,將會逐漸揭開自定義View的神祕面紗,每一篇都將比上一篇內容更加深入,利用所學的知識能夠製作更加炫酷自定義View,就像在臺階上一樣,每一篇都更上一層,幫助大家一步步走向人生巔峰,出任CEO,迎娶白富美。 誤

Android——定義View(學習Android開發藝術探索)

ViewRoot和DecorView ViewRoot對應於ViewRootImpl類,是連線WindowManager和DecorView的紐帶,View的三大流程均是通過ViewRoot來完成的。在ActivityThread中,當Activity物件被建

Android定義View高階(一)-分類流程

一.自定義View繪製流程 二.自定義View分類 自定義ViewGroup 自定義ViewGroup一般是利用現有的元件根據特定的佈局方式來組成新的元件,大多繼承自ViewGroup或各種Layout。 自定義View 在沒有現成的View,

定義View實戰之漸變,可撥動,帶動畫圓環控制元件實現

效果圖預覽 1. 分析 1. 繪製中間數字 2. 繪製帶刻度的圓環 考慮分成若干等份 3. 繪製漸變圓環 需要用到漸變相關屬性 4. 動畫處理的同時需要考慮時時計算角度 5. 圓環開關控制

定義view中的layoutSubviewdrawRect簡單總結

-(void)layoutSubviews{}方法說明:當我們自定義view時(系統view無法更改),如果我們的view中有子view,怎麼辦?往哪裡寫佈局?那麼就是去重寫這個方法。而以下的幾種情況也是說這個自定義view中的佈局何時被觸發: 1、[self setNee

動畫 學習Demo定義View: ViewExample

動畫 學習Demo與自定義View: ViewExample http://blog.csdn.net/harvic880925/article/details/50995268 https://www.jianshu.com/p/9ad3aaae0c63 ht

android進階4step1:Android動畫處理定義View——SurfaceView

SurfaceView簡介 1、SurfaceView與View的區別 2、SurfaceView的具體使用場景 3、如何使用SurfaceView 一、SurfaceView與View的區別 1、不使用onDraw 2、非UI執行緒繪製 3、獨立

android進階4step1:Android動畫處理定義View——定義View

為什麼要自定義控制元件 特定的顯示風格 處理特有的使用者互動 優化我們的佈局 封裝等... 如何自定義控制元件 自定義屬性的宣告與獲取 測量onMeasure 繪製onDraw 狀態的儲存與恢復 步驟一、自定義屬性宣告與獲取

android進階4step1:Android動畫處理定義View——轉場動畫

以下都需要執行在5.0以上 一、揭露動畫效果 參考:使用Circular Reveal為你的應用新增揭露動畫效果 最主要的類Circular Reveal 官方將這一動畫稱為揭露效果,它在官網中的描述是這樣的: 當您顯示或隱藏一組 UI 元素時,揭露動畫可為使用者提供視覺

使用屬性動畫以及定義view實現圖片的顯示隱藏

效果圖為:點選加號按鈕,加號隱藏,減號旋轉顯示,另外三張圖片也旋轉一定角度顯示 點選減號按鈕,減號隱藏,加號旋轉顯示,另外三張圖片也旋轉一定角度隱藏 首先放五張圖片,使用RelativeLayout佈局,因為可以使這五張圖片重疊起來 customer.xml佈局 &l

定義View分類流程

ces ted function ram 註意 measure fin 利用 href 自定義View分類與流程(進階篇)## 轉載出處: http://www.gcssloop.com/customview/CustomViewProcess/ 自定義View繪制流程

Android定義viewactivity的傳值

重復 轉動 自定義 activit 廣播 內部 代碼 view 等待 昨晚在寫團隊項目的時候,遇到一個問題,直到今天早上才解決。。。即在自定義view“轉盤”結束轉動後獲取結果的處理中,我是想吧值傳到activity中的一個textview中的,但我的自定義view類不是a

定義View之Rect的使用理解

此篇為我的第一篇部落格,藉此平臺讓更多的人知道和掌握更多android的知識,希望能越來越優秀.高手過招,不只是會用,更多的是理解它的原理,能舉一反三,與已知知識對比學習,方便記憶與理解,下面,我們直接進入正題.我的文章會有一個很明顯的特徵,就是中學時期老師所講的"3W"原則,what(是什麼),h

定義view,繪製階段進度progressBar,階段圖片和文字對齊

  沒用seekbar或者progressbar原生控制元件,通過繪製實現。只講下有用的思想,無關屬性不解釋,也不用看。 主要看onDraw方法程式碼: 繪製背景線,canvas.drawRect線繪製了第一條線,因為需要漸變,可以看到canvas.drawPath是從第

HenCoder Android 定義 View 1-7:屬性動畫 Property Animation(進階篇)

這期是 HenCoder 自定義繪製的第 1-7 期:屬性動畫(進階篇) 簡介 上期的內容,對於大多數簡單的屬性動畫場景已經夠用了。這期的內容主要針對兩個方面: 針對特殊型別的屬性來做屬性動畫; 針對複雜的屬性關係來做屬性動畫。 TypeEvaluator

Android定義View動畫

執行效果: 前言: Android系統提供了兩個動畫框架:屬性動畫框架和View動畫框架。 兩個動畫框架都是可行的選項,但是屬性動畫框架通常是首選的使用方法,因為它更靈活,並提供更多的功能。 除了這兩個框架,還可以使用Drawable動畫(即逐幀動畫,Animatio

Android 定義View之咖啡動畫

文章目錄效果畫杯子畫杯墊畫煙霧 效果 大概思路 自定義view,直接繼承view 複寫onSizeChanged()方法,在此計算杯墊,杯子,煙霧效果的path 在onDraw()方法中,描繪杯墊,杯子 處理煙霧動畫效果 畫杯子 這裡需要畫兩部分內容,第

Android 定義View之下雨動畫

文章目錄效果思路畫雲畫雨滴優化 效果 開始前先做個熱身( ˘•灬•˘ ) 自己實現比較容易,但是到了要出部落格整理思路,總結要點的時候就撓頭,不知雲所以,所以最簡單的還是 如果對安卓UI有興趣的朋友可以加我好友互相探討, 思路 思路比較簡單,整個view無

定義View——聚焦動畫控制元件

我儘量不打錯別字,用詞準確,不造成閱讀障礙。 這個自定義View是很簡單的一個,效果是在拍攝圖片時的對焦動畫,在自定義SurfaceView中使用這個控制元件就好了。 效果如下: 程式碼: public class FocusView extends Vi