日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android+动画队列,Android属性动画详解

發布時間:2025/3/20 Android 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android+动画队列,Android属性动画详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

屬性動畫是Android 3.0(API 11)新加入的動畫框架,屬性動畫彌補了視圖動畫的很多短板,因此已經成為大多數動畫場景的首選框架。

目錄

目錄

1. 屬性動畫出現的原因

在屬性動畫出現以前,Android主要有兩種動畫,幀動畫(Frame Animation)和補間動畫(Tween Animation),這兩種動畫統稱為視圖動畫。幀動畫是通過逐幀播放圖片來實現動畫效果,補間動畫雖然提供了旋轉、縮放、位移、透明度的動畫效果,卻有不可忽視的3大缺陷:

作用對象有限,只能作用于View及其子類

動畫種類有限,只有旋轉、縮放、位移、透明度4種動畫

只是改變了View的顯示效果,沒有真正改變View的屬性。例如:對

View作位移的補間動畫后,View雖然顯示改變,但是響應區域卻還在原來的位置,這在很多應用場景下是不可行的。

因此,為了彌補視圖動畫的不足,屬性動畫就應運而生了。

2. 屬性動畫概述

2.1 原理

屬性動畫通過在預設的規則下不斷地改變值,并將值設置給作用對象的屬性,從而達到動畫效果。這個規則可以由我們定制,其中有兩個重要的工具,可以幫助我們定制值的變化規則,一個是插值器(Interpolator),一個是估值器(TypeEvaluator)

2.2 插值器

插值器定義了動畫的變化率,能幫助我們實現非線性改變的動畫。Android提供了幾種插值器,如加速變化的AccelerateInterpolator,先加速后減速的AccelerateDecelerateInterpolator等等,感興趣的朋友可以自行百度查看。如果系統提供的插值器不能滿足我們的要求,我們還可以自定義插值器(通過下面的方式)

/**

* 自定義插值器

* 實現TimeInterpolator接口

*

*/

class MyInterpolator implements TimeInterpolator{

//實現getInterpolation方法

//此方法的參數input可理解為動畫的進度,值的區間是在[0,1],在此區間里隨著時間均勻地改變

//返回值是內插值,從廣義上理解是一個時間因子,體現了動畫在時間上的變化因素;從狹義上可理解為動畫改變的百分比

@Override

public float getInterpolation(float input) {

return 0;

}

}

2.3 估值器

估值器的作用是根據開始值、結束值、開始結束之間的一個比例來計算出最終的值。在屬性動畫上則是計算出動畫對應的最終的屬性值。系統默認提供了3種估值器

IntEvaluator整型估值器,值的類型為整型

FloatEvaluator浮點型估值器,值的類型為浮點型

ArgbEvaluator,值的類型為ARGB值,可以用來計算顏色值

如果系統提供的估值器不能滿足我們的要求,我們還可以自定義估值器

/**

* 自定義估值器

* 實現TypeEvaluator接口

*/

class MyEvaluator implements TypeEvaluator{

/**

*

* @param fraction 開始過渡到結束之間的一個比例

* @param startValue 開始值

* @param endValue 結束值

* @return 開始過渡到結束的具體值

*/

@Override

public T evaluate(float fraction, T startValue, T endValue) {

return null;

}

}

3. 屬性動畫的使用

屬性動畫主要通過兩個類來使用,ValueAnimator和ObjectAnimator,這兩個的區別主要是ValueAnimator只是計算值,賦值給對象屬性需要我們手動監聽值的變化來進行;ObjectAnimator則對賦值屬性這一步封裝進了內部,也就是自動賦值。

3.1 ValueAnimator

3.1.1 創建ValueAnimator

創建ValueAnimator可以在代碼里面創建、設置,也可以在xml里面創建、設置

xml創建

在res目錄里創建animator目錄,之后創建Animator resources file,ValueAnimator在xml文件的根結點是animator,例如:

android:valueFrom="30"

android:valueTo="60"

android:duration="2000"

android:valueType="intType" //選擇值的類型

android:interpolator="@android:anim/accelerate_decelerate_interpolator"

android:repeatMode="reverse"

android:repeatCount="1">

之后直接在代碼里面加載剛才的資源文件就可以了

ValueAnimator valueAnimator= (ValueAnimator) AnimatorInflater.loadAnimator(this,R.animator.textsize_animator);

代碼里創建

雖然ValueAnimator提供了公共的無參的構造方法,但是官方建議我們使用其工廠方法來創建ValueAnimator

(1)ValueAnimator.ofInt(int... values)

使用這種方式創建ValueAnimator,值的類型是int,會默認使用整形估值器。

(2)ValueAnimator.ofFloat(float... values)

對應值的類型是float,會默認使用浮點型估值器

(3)ValueAnimator.ofArgb(int... values)

對應值的類型是代表顏色的32位的int,會默認使用ArgbEvaluator估值器

(4)ValueAnimator.ofObject(TypeEvaluator evaluator,Object... values)

對應值的類型是Object,這種方式需要顯式傳入估值器,因為對于Object類型沒有系統提供的估值器,也不可能提供估值器,因為對于不同的對象其計算方式不同

3.1.2 設置ValueAnimator

ValueAnimator提供了方法設置其動畫的相關的屬性,具體如下

valueAnimator.setDuration(2000);//設置動畫持續時間,以毫秒為單位

valueAnimator.setInterpolator(new DecelerateInterpolator());//設置插值器

valueAnimator.setRepeatMode(ValueAnimator.REVERSE);//設置動畫重復模式,RESTART表示動畫正序重復,REVERSE代表倒序重復

valueAnimator.setRepeatCount(1);//設置重復次數,也就是動畫播放次數=RepeatCount+1,ValueAnimator.INFINITE表示無限重復

valueAnimator.setStartDelay(1000);//設置動畫延遲播放的時間

3.1.3 監聽動畫值

ValueAnimator提供了回調以監聽動畫值,我們可以在此回調中拿到屬性值并手動賦值給對象屬性,從而達到效果,需要注意的是,對象是View的時候,有時需要我們在賦值屬性后調用View.invalidate()或者View.requestLayout()方法來刷新界面實現視覺效果

valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {//動畫值更新時的監聽器

@Override

public void onAnimationUpdate(ValueAnimator animation) {//動畫更新時會回調此方法

Float value= (Float) animation.getAnimatedValue();//拿到更新后動畫值

tvAnimator.setTextSize(value);//手動將動畫值賦值給對象

}

});

3.2 ObjectAnimator

ObjectAnimator利用反射調用對象屬性的set方法從而自動賦值給對象屬性完成動畫,也就是說ObjectAnimator作用的對象必須提供該屬性的set方法(如果沒有提供初始值,還必須提供get方法)需要注意的是,set和get方法名必須滿足如下規則

set/get+屬性名(屬性名頭字母大寫)

3.2.1 創建ObjectAnimator

xml創建

在res/animator目錄下創建animator的xml文件,根結點為objectAnimator

android:valueType="floatType"

android:valueTo="200.0"

android:valueFrom="100.0"

android:interpolator="@android:anim/accelerate_decelerate_interpolator"

android:propertyName="width"

/>

在代碼里加載xml創建的ObjectAnimator并設置作用對象

ObjectAnimator objectAnimator= (ObjectAnimator) AnimatorInflater.loadAnimator(this,R.animator.test);//加載xml中的動畫

objectAnimator.setTarget(tvAnimator);//設置作用對象

代碼里創建

和ValueAnimator的方式差不多,這里以ofInt為例說明創建方式,其他的可以類推。

/*

1. 參數解釋

target:ObjectAnimator作用的對象

propertyName:屬性名

values:過渡值(開始值、結束值)

*/

ObjectAnimator objectAnimator=ObjectAnimator.ofInt(Object target,String propertyName,int... values);

3.2.2 設置ObjectAnimator

同ValueAnimator設置方式一樣,不再贅述。

3.3 AnimatorSet(組合動畫)

AnimatorSet用于把很多動畫按照一定順序組合起來播放,AnimatorSet采用了構造器模式來組合動畫

public Builder play(Animator anim) {

if (anim != null) {

return new Builder(anim);

}

return null;

}

//play函數會生成構造器并將該動畫加入到播放隊列中

play函數是AnimatorSet中唯一可以創建構造器的函數,此外構造器還提供了多種方法組合動畫,這些方法都是以play函數傳入的Animator作為基準來構建播放順序的,例如:

//將animator1和animator2一起播放

animatorSet.play(animator1).with(animator2);

//將animator1插入animator2之后播放

animatorSet.play(animator1).after(animator2);

//將animator1插入animator2之前播放

animatorSet.play(animator1).before(animator2);

AnimatorSet本身還提供了兩個方法來添加動畫,

public void playSequentially(Animator... items)//一個接一個地先后播放動畫組,前面的動畫先播放

public void playTogether(Animator... items)//同時播放動畫組

這兩個方法本質上也是采用了構造器的after、before和with方法來構建動畫的播放順序。

3.4 監聽動畫

Animator類允許對動畫開始、結束、取消、重復和暫停等時刻進行監聽

animator.addListener(new Animator.AnimatorListener() {

@Override

public void onAnimationStart(Animator animation) {

}

@Override

public void onAnimationEnd(Animator animation) {

}

@Override

public void onAnimationCancel(Animator animation) {

}

@Override

public void onAnimationRepeat(Animator animation) {

}

});

animator.addPauseListener(new Animator.AnimatorPauseListener() {

@Override

public void onAnimationPause(Animator animation) {

}

@Override

public void onAnimationResume(Animator animation) {

}

});

如果只想監聽其中的幾個方法,可以采用AnimatorListenerAdapter

animator.addListener(new AnimatorListenerAdapter() {

@Override

public void onAnimationStart(Animator animation) {

}

});

animator.addPauseListener(new AnimatorListenerAdapter() {

@Override

public void onAnimationPause(Animator animation) {

}

});

參考和擴展

總結

以上是生活随笔為你收集整理的android+动画队列,Android属性动画详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。