Android动画效果-更新中
概述
Android系統(tǒng)提供了三種實現(xiàn)動畫的方式,一種是補間動畫(Tween Animation 在SDK中成為View Animation),另一種是幀動畫(Frame Animation 在SDK中稱為Drawable Animation) ,第三種 屬性動畫(property animation )。
- 補間動畫可以實現(xiàn)View組件的移動、放大、縮小以及漸變等效果
- 幀動畫則提供了一種逐幀播放圖片的動畫方式
- 屬性動畫-補間動畫和幀動畫不能勝任復(fù)雜動畫,所以屬性動畫應(yīng)運而生
無論是補間動畫還是幀動畫或者是屬性動畫,Android均為其進行了封裝,提供了非常簡單的應(yīng)用接口。
3.0以前,android支持兩種動畫模式,tween animation,frame animation,在android3.0中又引入了一個新的動畫系統(tǒng):property animation。
這三種動畫模式在SDK中被稱為
view animation,
drawable animation,
property animation。
可通過NineOldAndroids項目在3.0之前的系統(tǒng)中使用Property Animation。
下面我們分別詳細的介紹下這三種動畫的使用。
補間動畫(Tween Animation/View Animation)
Animation類,動畫抽象類
Animation類是Android系統(tǒng)的一個動畫抽象類,所有其他一些動畫類都要繼承該類中的實現(xiàn)方法。Animation類主要用于補間動畫效果,提供了動畫啟動、停止、重復(fù)、持續(xù)時間等方法。Animation類中的方法適用于任何一種補間動畫對象。
setDuration方法:設(shè)置持續(xù)時間
【功能說明】該方法用于設(shè)置動畫的持續(xù)時間,以毫秒為單位。該方法是設(shè)置補間動畫時間長度的主要方法,使用非常普遍。
【基本語法】public void setDuration (long durationMillis)
其中,參數(shù)durationMillis為動畫的持續(xù)時間,單位為毫秒(ms)。
setDuration方法的示例可以參閱startNow方法中的示例代碼。
startNow方法:立刻啟動動畫
【功能說明】該方法用于啟動執(zhí)行一個動畫。該方法是啟動執(zhí)行動畫的主要方法,使用時需要先通過setAnimation方法為某一個View對象設(shè)置動畫。另外,用戶在程序中也可以使用View組件的startAnimation方法來啟動執(zhí)行動畫。
【基本語法】public void startNow ()
【實例演示】下面通過代碼來演示如何設(shè)置一個簡單的動畫效果。
import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.animation.Animation; import android.view.animation.TranslateAnimation; import android.widget.ImageView;import com.turing.base.R;public class Animation_startNow extends AppCompatActivity {private ImageView mIdIvFace;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_animation_start_now);mIdIvFace = (ImageView) findViewById(R.id.id_iv_face);// 設(shè)置移動效果/**** float fromXDelta 動畫開始的點離當(dāng)前View X坐標(biāo)上的差值* float toXDelta 動畫結(jié)束的點離當(dāng)前View X坐標(biāo)上的差值* float fromYDelta 動畫開始的點離當(dāng)前View Y坐標(biāo)上的差值* float toYDelta 動畫開始的點離當(dāng)前View Y坐標(biāo)上的差值*/Animation translateAnimation = new TranslateAnimation(0, 200, 0, 200);// 設(shè)置動畫持續(xù)時間translateAnimation.setDuration(3000);// 為ImageView設(shè)置動畫效果mIdIvFace.setAnimation(translateAnimation);// 啟動動畫translateAnimation.startNow();}}在這段代碼中,首先初始化了一個移動的動畫效果translateAnimation。然后,通過setDuration方法設(shè)置動畫持續(xù)時間,并為image對象設(shè)置動畫效果,最后使用startNow方法啟動動畫效果。
顯示效果:圖片將沿45 方向向右下角移動。
start方法:啟動動畫
【功能說明】該方法用于啟動執(zhí)行一個動畫。該方法是啟動執(zhí)行動畫的另一個主要方法,使用時需要先通過setAnimation方法為某一個View對象設(shè)置動畫。start方法區(qū)別于startNow方法的地方在于,start方法可以用于在getTransformation方法被調(diào)用時啟動動畫。
【基本語法】public void start ()
start方法的執(zhí)行效果類似于startNow方法,這里不再贅述。
cancel方法:取消動畫
【功能說明】該方法用于取消一個動畫的執(zhí)行。該方法是取得一個正在執(zhí)行中的動畫的主要方法。cancel方法和startNow方法結(jié)合可以實現(xiàn)對動畫執(zhí)行過程的控制。需要注意的是,通過cancel方法取消的動畫,必須使用reset方法或者setAnimation方法重新設(shè)置,才可以再次執(zhí)行動畫。
【基本語法】public void cancel ()
【實例演示】下面通過代碼來演示如何取消動畫效果執(zhí)行。
import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.animation.Animation; import android.view.animation.TranslateAnimation; import android.widget.Button; import android.widget.ImageView;import com.turing.base.R;public class Animation_cancel extends AppCompatActivity implements View.OnClickListener {private Button mIdBtnStartAnimation;private Button mIdBtnStopAnimation;private ImageView mIdIvFlag;Animation translateAnimation;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_animation_cancel);mIdBtnStartAnimation = (Button) findViewById(R.id.id_btn_startAnimation);mIdBtnStopAnimation = (Button) findViewById(R.id.id_btn_stopAnimation);mIdIvFlag = (ImageView) findViewById(R.id.id_iv_flag);mIdBtnStartAnimation.setOnClickListener(this);mIdBtnStopAnimation.setOnClickListener(this);// 設(shè)置 移動效果translateAnimation = new TranslateAnimation(0, 200, 0, 200);}/*** 2.3的版本 translateAnimation.startNow(); 有效,高版本無效 .* mIdIvFlag.startAnimation(translateAnimation); 高版本和低版本都有效。* @param v*/@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.id_btn_startAnimation:// 設(shè)置動畫時長translateAnimation.setDuration(3000);// 為imageView設(shè)置動畫mIdIvFlag.setAnimation(translateAnimation);// 開啟動畫// translateAnimation.startNow();mIdIvFlag.startAnimation(translateAnimation);break;case R.id.id_btn_stopAnimation:translateAnimation.cancel();break;default:break;}} }在這段代碼中,首先初始化了一個移動的動畫效果translateAnimation。然后,在第一個按鈕監(jiān)聽器中,通過setDuration方法設(shè)置動畫持續(xù)時間,并為image對象設(shè)置動畫效果,最后使用startNow方法啟動動畫效果。在第二個按鈕監(jiān)聽器中,調(diào)用cancel方法取消動畫執(zhí)行。
注意:
translateAnimation.startNow(); 2.3的版本 有效,高版本無效 .
mIdIvFlag.startAnimation(translateAnimation); 高版本和低版本都有效。
setRepeatCount方法:設(shè)置重復(fù)次數(shù)
【功能說明】該方法用于設(shè)置一個動畫效果重復(fù)執(zhí)行的次數(shù)。Android系統(tǒng)默認每個動畫僅執(zhí)行一次,通過該方法可以設(shè)置動畫執(zhí)行多次。
【基本語法】public void setRepeatCount (int repeatCount)
其中,參數(shù)repeatCount為重復(fù)執(zhí)行的次數(shù)。如果設(shè)置為n,則動畫將執(zhí)行n+1次。
【實例演示】下面通過代碼來演示如何連續(xù)執(zhí)行多次動畫效果。
translateAnimation.setRepeatCount(2); //設(shè)置重復(fù)次數(shù)注意:這里設(shè)置的是動畫重復(fù)執(zhí)行的次數(shù),而不是動畫執(zhí)行的次數(shù)。故動畫執(zhí)行的次數(shù)為動畫重復(fù)執(zhí)行的次數(shù)加1。
setFillEnabled方法:使能填充效果
【功能說明】該方法用于使能填充效果。當(dāng)該方法設(shè)置為true時,將執(zhí)行setFillBefore和setFillAfter方法,否則將忽略setFillBefore和setFillAfter方法。
【基本語法】public void setFillEnabled (boolean fillEnabled)
其中,參數(shù)fillEnabled為是否使能填充效果,true表示使能該效果,false表示禁用該效果。
setFillEnabled方法的示例可以參閱setFillBefore方法和setFillAfter方法中的示例代碼。
setFillBefore方法:設(shè)置起始填充
【功能說明】該方法用于設(shè)置一個動畫效果執(zhí)行完畢后,View對象返回到起始的位置。該方法的效果是系統(tǒng)默認的效果。該方法的執(zhí)行,需要首先通過setFillEnabled方法使能填充效果,否則設(shè)置無效。
【基本語法】public void setFillBefore (boolean fillBefore)
其中,參數(shù)fillBefore為是否執(zhí)行起始填充效果,true表示使能該效果,false表示禁用該效果。
【實例演示】下面通過代碼來演示如何讓View對象在動畫執(zhí)行完畢后回歸到起始位置。
//回歸起始位置 translateAnimation.setFillBefore(true); //使能填充效果 translateAnimation.setFillEnabled(true);通過setFillBefore方法使對象回到起始點,并使用setFillEnabled使能填充效果
當(dāng)點擊”START ANIMATION”按鈕時,圖片開始移動,當(dāng)動畫結(jié)束之后,圖片將自動跳回到起始位置。(默認效果)
setFillAfter方法:設(shè)置終止填充
【功能說明】該方法用于設(shè)置一個動畫效果執(zhí)行完畢后,View對象保留在終止的位置。該方法的執(zhí)行,需要首先通過setFillEnabled方法使能填充效果,否則設(shè)置無效。
【基本語法】public void setFillAfter (boolean fillAfter)
其中,參數(shù)fillAfter為是否執(zhí)行終止填充效果,true表示使能該效果,false表示禁用該效果。
【實例演示】下面通過代碼來演示如何讓View對象在動畫執(zhí)行完畢后保留在終止位置。
translateAnimation.setFillAfter (true); //保留在終止位置translateAnimation.setFillEnabled(true); //使能填充效果 ;通過setFillAfter方法使對象保留在終止點,并使用setFillEnabled使能填充效果。當(dāng)點擊”START ANIMATION”按鈕時,圖片開始移動,當(dāng)動畫結(jié)束之后,圖片將停留在終止位置。
setRepeatMode方法:設(shè)置重復(fù)模式
【功能說明】該方法用于設(shè)置一個動畫效果執(zhí)行的重復(fù)模式。Android系統(tǒng)中提供了幾種重復(fù)模式,其中最主要的便是RESTART模式和REVERSE模式。
【基本語法】public void setRepeatMode (int repeatMode)
其中,參數(shù)repeatMode為動畫效果的重復(fù)模式,常用的取值如下。
RESTART:重新從頭開始執(zhí)行。
REVERSE:反方向執(zhí)行。
【實例演示】下面通過代碼來演示如何更改動畫路徑的方向。
translateAnimation.setRepeatCount(2); //設(shè)置重復(fù)次數(shù)// translateAnimation.setRepeatMode(Animation.RESTART); //重新從頭translateAnimation.setRepeatMode(Animation.REVERSE); //反方向執(zhí)通過setRepeatCount方法設(shè)置重復(fù)次數(shù),通過setRepeatMode設(shè)置重復(fù)模式,最后使用startAnimation方法啟動動畫效果。
如果設(shè)置的重復(fù)模式為Animation.RESTART,則表示重新從頭開始執(zhí)行。
如果設(shè)置的重復(fù)模式為Animation.REVERSE,則表示反方向執(zhí)行,當(dāng)一次動畫執(zhí)行結(jié)束之后,圖片將向反方向運動。
setStartOffset方法:設(shè)置啟動時間
【功能說明】該方法用于設(shè)置一個動畫執(zhí)行的啟動時間,單位為毫秒。系統(tǒng)默認當(dāng)執(zhí)行start方法后立刻執(zhí)行動畫,當(dāng)使用該方法設(shè)置后,將延遲一定的時間再啟動動畫。
【基本語法】public void setStartOffset (long startOffset)
其中,參數(shù)startOffset為動畫的啟動時間,單位為毫秒(ms)。
【實例演示】下面通過代碼來演示如何更改動畫的啟動時間。
translateAnimation.setStartOffset(3000); //設(shè)置啟動時間通過setStartOffset方法設(shè)置動畫的啟動時間,當(dāng)點擊”START ANIMATION”按鈕時,將等待3秒之后,圖片才開始移動。
TranslateAnimation類:位置變化動畫類
TranslateAnimation類是Android系統(tǒng)中的位置變化動畫類,用于控制View對象的位置變化,該類繼承于Animation類。TranslateAnimation類中的很多方法都與Animation類一致,該類中最常用的方法便是TranslateAnimation構(gòu)造方法。
【基本語法】public TranslateAnimation (float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
參數(shù)說明
fromXDelta:位置變化的起始點X坐標(biāo)。
toXDelta:位置變化的結(jié)束點X坐標(biāo)。
fromYDelta:位置變化的起始點Y坐標(biāo)。
toYDelta:位置變化的結(jié)束點Y坐標(biāo)。
RotateAnimation類:旋轉(zhuǎn)變化動畫類
RotateAnimation類是Android系統(tǒng)中的旋轉(zhuǎn)變化動畫類,用于控制View對象的旋轉(zhuǎn)動作,該類繼承于Animation類。RotateAnimation類中的很多方法都與Animation類一致,該類中最常用的方法便是RotateAnimation構(gòu)造方法。
【基本語法】public RotateAnimation (float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
參數(shù)說明
fromDegrees:旋轉(zhuǎn)的開始角度。
toDegrees:旋轉(zhuǎn)的結(jié)束角度。
pivotXType:X軸的伸縮模式,可以取值為ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
pivotXValue:X坐標(biāo)的伸縮值。
pivotYType:Y軸的伸縮模式,可以取值為ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
pivotYValue:Y坐標(biāo)的伸縮值。
【實例演示】下面通過代碼來演示如何設(shè)置一個簡單的旋轉(zhuǎn)變化動畫效果。
import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.animation.Animation; import android.view.animation.RotateAnimation; import android.widget.Button; import android.widget.ImageView;import com.apkfuns.logutils.LogUtils; import com.turing.base.R; import com.turing.base.utils.AlertUtil;public class RotateAnimationDemo extends AppCompatActivity implements View.OnClickListener {private Button mIdBtnStartAnimation;private Button mIdBtnStopAnimation;private ImageView mIdIvFlag;private Animation rotateAnimation;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_rotate_animation_demo);// 初始組件 注冊監(jiān)聽assignViews();//設(shè)置旋轉(zhuǎn)變化動畫對象rotateAnimation = new RotateAnimation(0f, 360f,Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF, 0.5f);}private void assignViews() {mIdBtnStartAnimation = (Button) findViewById(R.id.id_btn_startAnimation1);mIdBtnStopAnimation = (Button) findViewById(R.id.id_btn_stopAnimation1);mIdIvFlag = (ImageView) findViewById(R.id.id_iv_flag1);mIdBtnStartAnimation.setOnClickListener(this);mIdBtnStopAnimation.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.id_btn_startAnimation1:// 開始動畫AlertUtil.showToastShort(RotateAnimationDemo.this, "start");LogUtils.d("start");rotateAnimation.setDuration(3000); //持續(xù)時間mIdIvFlag.setAnimation(rotateAnimation); //設(shè)置動畫mIdIvFlag.startAnimation(rotateAnimation); //啟動動畫break;case R.id.id_btn_stopAnimation1:// 取消動畫rotateAnimation.cancel();break;default:break;}} }首先通過RotateAnimation構(gòu)造方法創(chuàng)建了一個旋轉(zhuǎn)變化的動畫對象。然后,在第一個按鈕監(jiān)聽器中設(shè)置了動畫的持續(xù)時間,之后啟動該動畫。在第二個按鈕監(jiān)聽器中取消該動畫
ScaleAnimation類:尺寸變化動畫類
ScaleAnimation類是Android系統(tǒng)中的尺寸變化動畫類,用于控制View對象的尺寸變化,該類繼承于Animation類。ScaleAnimation類中的很多方法都與Animation類一致,該類中最常用的方法便是ScaleAnimation構(gòu)造方法。
【基本語法】public ScaleAnimation (float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
參數(shù)說明
fromX:起始X坐標(biāo)上的伸縮尺寸。
toX:結(jié)束X坐標(biāo)上的伸縮尺寸。
fromY:起始Y坐標(biāo)上的伸縮尺寸。
toY:結(jié)束Y坐標(biāo)上的伸縮尺寸。
pivotXType:X軸的伸縮模式,可以取值為ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
pivotXValue:X坐標(biāo)的伸縮值。
pivotYType:Y軸的伸縮模式,可以取值為ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
pivotYValue:Y坐標(biāo)的伸縮值。
【實例演示】下面通過代碼來演示如何設(shè)置一個簡單的尺寸變化動畫效果。
public class ScaleAnimationDemo extends AppCompatActivity implements View.OnClickListener {private Button mIdBtnStartAnimation;private Button mIdBtnStopAnimation;private ImageView mIdIvFlag;ScaleAnimation scaleAnimation;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_scale_animation_demo);assignViews();//設(shè)置尺寸變化動畫對象scaleAnimation = new ScaleAnimation(0f, 1f, 0f, 1f,Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);}private void assignViews() {mIdBtnStartAnimation = (Button) findViewById(R.id.id_btn_startAnimation1);mIdBtnStopAnimation = (Button) findViewById(R.id.id_btn_stopAnimation1);mIdIvFlag = (ImageView) findViewById(R.id.id_iv_flag1);mIdBtnStartAnimation.setOnClickListener(this);mIdBtnStopAnimation.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.id_btn_startAnimation1:// 開始動畫scaleAnimation.setDuration(3000); //持續(xù)時間mIdIvFlag.setAnimation(scaleAnimation); //設(shè)置動畫mIdIvFlag.startAnimation(scaleAnimation); //啟動動畫break;case R.id.id_btn_stopAnimation1:// 取消動畫scaleAnimation.cancel();break;default:break;}} }首先通過ScaleAnimation構(gòu)造方法創(chuàng)建了一個尺寸變化的動畫對象。然后,在第一個按鈕監(jiān)聽器中設(shè)置了動畫的持續(xù)時間,之后啟動該動畫。在第二個按鈕監(jiān)聽器中取消該動畫。讀者運行這段代碼,將看到圖片從小到大逐漸變化,最后,圖片增大到原始尺寸的時候停止。
AlphaAnimation類:透明度變化動畫類
AlphaAnimation類是Android系統(tǒng)中的透明度變化動畫類,用于控制View對象的透明度變化,該類繼承于Animation類。AlphaAnimation類中的很多方法都與Animation類一致,該類中最常用的方法便是AlphaAnimation構(gòu)造方法。
【基本語法】public AlphaAnimation (float fromAlpha, float toAlpha)
參數(shù)說明
fromAlpha:開始時刻的透明度,取值范圍0~1。
toAlpha:結(jié)束時刻的透明度,取值范圍0~1。
【實例演示】下面通過代碼來演示如何設(shè)置一個簡單的漸變透明度動畫效果。
這里寫代碼片首先通過AlphaAnimation構(gòu)造方法創(chuàng)建了一個透明度變化的動畫對象。然后,在第一個按鈕監(jiān)聽器中設(shè)置了動畫的持續(xù)時間,之后啟動該動畫。在第二個按鈕監(jiān)聽器中取消該動畫。運行這段代碼,將看到圖片的透明度由淺入深逐漸變化。最后,圖片變?yōu)橥耆煌该鞯臅r候停止。
AnimationSet類:動畫集合類
AnimationSet類是Android系統(tǒng)中的動畫集合類,用于控制View對象進行多個動作的組合,該類繼承于Animation類。AnimationSet類中的很多方法都與Animation類一致,該類中最常用的方法便是addAnimation方法,該方法用于為動畫集合對象添加動畫對象。
【基本語法】public void addAnimation (Animation a)
其中,參數(shù)a為Animation動畫對象,可以是前述任何一種補間動作。
【實例演示】下面通過代碼來演示如何設(shè)置一個組合動畫效果。
public class AnimationSetDemo extends AppCompatActivity implements View.OnClickListener {private Button mIdBtnStartAnimation;private Button mIdBtnStopAnimation;private ImageView mIdIvFlag;Animation translateAnimation, scaleAnimation, alphaAnimation;AnimationSet animationSet;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_animation_set_demo);assignViews();//設(shè)置位置變化動畫translateAnimation = new TranslateAnimation(0, 300, 0, 300);//設(shè)置尺寸變化動畫scaleAnimation = newScaleAnimation(0f, 1f, 0f, 1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);//設(shè)置透明度變化動畫alphaAnimation = new AlphaAnimation(0.1f, 1.0f);}private void assignViews() {mIdBtnStartAnimation = (Button) findViewById(R.id.id_btn_startAnimation1);mIdBtnStopAnimation = (Button) findViewById(R.id.id_btn_stopAnimation1);mIdIvFlag = (ImageView) findViewById(R.id.id_iv_flag1);mIdBtnStartAnimation.setOnClickListener(this);mIdBtnStopAnimation.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.id_btn_startAnimation1:// 開始動畫translateAnimation.setDuration(10000); //設(shè)置位置變化動畫的持續(xù)時間scaleAnimation.setDuration(10000); //設(shè)置尺寸變化動畫的持續(xù)時間alphaAnimation.setDuration(10000); //設(shè)置透明度漸變動畫的持續(xù)時間animationSet = new AnimationSet(true); //創(chuàng)建動畫集對象animationSet.addAnimation(translateAnimation); //添加位置變化動畫animationSet.addAnimation(scaleAnimation); //添加尺寸變化動畫animationSet.addAnimation(alphaAnimation); //添加透明度漸變動畫animationSet.setFillAfter(true); //停留在最后的位置animationSet.setFillEnabled(true);mIdIvFlag.setAnimation(animationSet); //設(shè)置動畫// animationSet.startNow(); 高版本中無效,2.3可以,不建議使用mIdIvFlag.startAnimation(animationSet); //啟動動畫break;case R.id.id_btn_stopAnimation1:// 取消動畫animationSet.cancel();break;default:break;}} }首先構(gòu)造了位置變化、尺寸變化和透明度變化動畫的對象。然后,在第一個按鈕監(jiān)聽器中分別設(shè)置了動畫的持續(xù)時間,并通過addAnimation方法添加到動畫集中,之后啟動該動畫。
在第二個按鈕監(jiān)聽器中取消該動畫。
運行這段代碼,將會看到顯示效果:圖片從小到大,由淺入深,從左上角向右下角移動。當(dāng)動畫結(jié)束的時候,圖片對象將停留在結(jié)束點的位置。
AnimationUtils類:動畫工具類
AnimationUtils類是Android系統(tǒng)中的動畫工具類,提供了控制View對象的一些工具。該類中最常用的方法便是loadAnimation方法,該方法用于加載XML格式的動畫配置文件。在Android系統(tǒng)中,除了在代碼中設(shè)置動畫效果外,還可以在XML配置文件中設(shè)置動畫的組合動作,這種方式適用性更好。
【基本語法】public static Animation loadAnimation (Context context, int id)
參數(shù)說明
context:上下文對象。
id:動畫配置文件的ID。
【實例演示】下面通過代碼來演示如何加載一個XML組合動畫效果。
public class AnimationUtilsDemo extends AppCompatActivity implements View.OnClickListener {private Button mIdBtnStartAnimation;private Button mIdBtnStopAnimation;private ImageView mIdIvFlag;//動畫對象Animation loadAnimation;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_animation_utils_demo);assignViews();}private void assignViews() {mIdBtnStartAnimation = (Button) findViewById(R.id.id_btn_startAnimation1);mIdBtnStopAnimation = (Button) findViewById(R.id.id_btn_stopAnimation1);mIdIvFlag = (ImageView) findViewById(R.id.id_iv_flag1);mIdBtnStartAnimation.setOnClickListener(this);mIdBtnStopAnimation.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.id_btn_startAnimation1:// 開始動畫loadAnimation = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.anim);mIdIvFlag.setAnimation(loadAnimation); //為控件設(shè)置動畫loadAnimation.setFillAfter(true); //停留在結(jié)束位置loadAnimation.setFillEnabled(true);mIdIvFlag.startAnimation(loadAnimation);//開始動畫break;case R.id.id_btn_stopAnimation1:// 取消動畫loadAnimation.cancel();break;default:break;}}}首先聲明了動畫對象。然后,在第一個按鈕監(jiān)聽器中通過loadAnimation方法加載動畫配置文件,并設(shè)置了動畫的一些特征,最后開始執(zhí)行動畫。在第二個按鈕監(jiān)聽器中調(diào)用cancel方法取消動畫執(zhí)行。這里用到的動畫配置文件如下所示,里面定義了位置移動和旋轉(zhuǎn)的組合動畫效果。
anim.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"><translate android:duration="3000"android:toXDelta="0"android:toYDelta="300" /><rotate android:duration="3000"android:fromDegrees="270"android:pivotX="50%"android:pivotY="50%"android:toDegrees="360" /> </set>幀動畫(Frame Aniamtion/Drawable Animation)
AnimationDrawable類:幀動畫類
AnimationDrawable類是Android系統(tǒng)中的幀動畫類。幀動畫方式類似于放電影的原理,是通過順序播放多張圖片來實現(xiàn)動畫效果的,圖片之間有一定的動作連貫性,這樣人眼看來就像對象真正在運動一樣。AnimationDrawable類位于android.graphics.drawable軟件包中,本節(jié)將介紹幀動畫類中的主要編程方法。
start方法:開始動畫
【功能說明】該方法用于開始動畫執(zhí)行,其是幀動畫效果執(zhí)行的主要方法。
【基本語法】public void start ()
【實例演示】下面通過代碼來演示如何實現(xiàn)一個簡單的幀動畫。
public class AnimationDrawable_start extends AppCompatActivity implements View.OnClickListener {private Button mIdBtnStartAnimation;private ImageView mIdIvHorse;AnimationDrawable animationDrawable;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_animation_drawable_start);mIdBtnStartAnimation = (Button) findViewById(R.id.id_btn_startAnimation);mIdIvHorse = (ImageView) findViewById(R.id.id_iv_horse);mIdBtnStartAnimation.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.id_btn_startAnimation://聲明幀動畫對象 通過imageview.getBackgroundanimationDrawable = (AnimationDrawable) mIdIvHorse.getBackground();animationDrawable.start(); //開始動畫AlertUtil.showToastShort(AnimationDrawable_start.this,"start");break;default:break;}} } <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><Button android:id="@+id/id_btn_startAnimation"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="開始幀動畫" /><ImageView android:id="@+id/id_iv_horse"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/anim_zhuzhen"android:layout_below="@id/id_btn_startAnimation" /></RelativeLayout>首先聲明了幀動畫對象,然后在按鈕監(jiān)聽器中直接調(diào)用start方法來開始動畫執(zhí)行。為了能夠?qū)崿F(xiàn)動畫效果,還需要指定幀動畫所需要的圖片和動畫順序。然后,在res/drawable目錄下新建一個幀動畫配置文件,并將其設(shè)置為圖片控件的背景。幀動畫配置文件的內(nèi)容如下:
<?xml version="1.0" encoding="utf-8"?><!--根標(biāo)簽為animation-list,其中oneshot代表著是否只展示一遍,設(shè)置為false會不停的循環(huán)播放動畫根標(biāo)簽下,通過item標(biāo)簽對動畫中的每一個圖片進行聲明android:duration 表示展示所用的該圖片的時間長度--> <animation-list xmlns:android="http://schemas.android.com/apk/res/android"android:oneshot="true"><item android:drawable="@drawable/horse1"android:duration="100" /><item android:drawable="@drawable/horse2"android:duration="100" /><item android:drawable="@drawable/horse3"android:duration="100" /><item android:drawable="@drawable/horse4"android:duration="100" /><item android:drawable="@drawable/horse5"android:duration="100" /><item android:drawable="@drawable/horse6"android:duration="100" /><item android:drawable="@drawable/horse7"android:duration="100" /><item android:drawable="@drawable/horse8"android:duration="100" /> </animation-list>stop方法:停止動畫
【功能說明】該方法用于停止動畫執(zhí)行,其是幀動畫效果停止的主要方法。start方法常和stop方法一起來使用。
【基本語法】public void stop ()
【實例演示】下面通過代碼來演示如何實現(xiàn)一個簡單的幀動畫。
@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.id_btn_startAnimation:animationDrawable.start(); //開始動畫break;case R.id.id_btn_stop:animationDrawable.stop(); //停止動畫break;default:break;}}注意:
如果在Activity中我不想用按鈕觸發(fā)這個動畫,要程序運行即播放動畫,怎么做呢?
最好是在onWindowFocusChanged這個方法中啟動動畫。因為在onCreate中啟動動畫, AnimationDrawable有可能還沒有完全attach 到Window上
addFrame方法:添加動畫幀
【功能說明】該方法用于為幀動畫對象添加動畫幀。該方法主要用于動態(tài)修改幀動畫內(nèi)容的場合,可以根據(jù)需要增加一些動畫幀。
【基本語法】public void addFrame (Drawable frame, int duration)
參數(shù)說明
frame:動畫幀的Drawable對象。
duration:動畫幀的持續(xù)時間,單位為毫秒。
【實例演示】下面通過代碼來演示如何實現(xiàn)一個簡單的幀動畫。
public class AnimationDrawable_addFrame extends AppCompatActivity implements View.OnClickListener {private Button mIdBtnStartAnimation, id_btn_stop;private ImageView mIdIvHorse;AnimationDrawable animationDrawable;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_animation_drawable_add_frame);mIdBtnStartAnimation = (Button) findViewById(R.id.id_btn_startAnimation);id_btn_stop = (Button) findViewById(R.id.id_btn_stop);mIdIvHorse = (ImageView) findViewById(R.id.id_iv_horse);//聲明幀動畫對象animationDrawable = (AnimationDrawable) mIdIvHorse.getBackground();// 注冊監(jiān)聽監(jiān)聽事件mIdBtnStartAnimation.setOnClickListener(this);id_btn_stop.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.id_btn_startAnimation:animationDrawable.addFrame(getResources().getDrawable(R.drawable.zzlx1), 100);//添加幀animationDrawable.addFrame(getResources().getDrawable(R.drawable.zzlx2), 100);//添加幀animationDrawable.addFrame(getResources().getDrawable(R.drawable.zzlx3), 100);//添加幀animationDrawable.addFrame(getResources().getDrawable(R.drawable.zzlx4), 100);//添加幀animationDrawable.addFrame(getResources().getDrawable(R.drawable.zzlx5), 100);//添加幀animationDrawable.addFrame(getResources().getDrawable(R.drawable.zzlx6), 100);//添加幀animationDrawable.addFrame(getResources().getDrawable(R.drawable.zzlx7), 100);//添加幀animationDrawable.addFrame(getResources().getDrawable(R.drawable.zzlx8), 100);//添加幀animationDrawable.start(); //開始動畫break;case R.id.id_btn_stop:animationDrawable.stop();break;default:break;}}}首先聲明了幀動畫對象。然后,在第一個按鈕監(jiān)聽器中使用addFrame方法添加了動畫幀,之后直接調(diào)用start方法來開始動畫執(zhí)行,在第二個按鈕監(jiān)聽器中直接調(diào)用stop方法來停止動畫執(zhí)行
setOneShot方法:設(shè)置播放方式
【功能說明】該方法用于設(shè)置幀動畫的播放方式,可以是單次播放,也可以是循環(huán)播放。在系統(tǒng)默認情況下采用的是單次播放的方式。該方法主要用于循環(huán)播放的場合。
【基本語法】public void setOneShot (boolean oneShot)
其中,參數(shù)oneShot表示了動畫是否執(zhí)行一次,true表示僅執(zhí)行一次,false表示無限次循環(huán)執(zhí)行動畫效果。
ad.setOneShot(false); //循環(huán)播放 ad.start(); //開始動畫setAlpha方法:設(shè)置透明度
【功能說明】該方法用于設(shè)置幀動畫播放過程中圖片的透明度。該方法經(jīng)常用于一些特效顯示效果的場合。
【基本語法】public void setAlpha (int alpha)
其中,參數(shù)alpha表示圖片的透明度,取值范圍為0~255。
ad.setAlpha(100); //設(shè)置透明度 ad.start(); //開始動畫 }getNumberOfFrames方法:獲取幀數(shù)
【功能說明】該方法用于獲取動畫的幀個數(shù),也就是按照順序播放了幾張圖片。該方法常常用于獲取幀動畫對象特性的場合。
【基本語法】public int getNumberOfFrames ()
【實例演示】下面通過代碼來演示如何獲取幀動畫播放幀的個數(shù)。
int num; ad.start(); //開始動畫 num=ad.getNumberOfFrames(); //獲取幀數(shù) Toast.makeText(getApplicationContext(), "當(dāng)前動畫需要播放"+num+"幀", Toast.LENGTH_LONG).show(); //顯示 }小結(jié)
動畫技術(shù)能夠給應(yīng)用程序帶來豐富的特效,增強用戶體驗。Android3.0之前的SDK提供了兩種動畫實現(xiàn)方式,補間動畫(Tween Animation)和幀動畫(Frame Animation)。補間動畫可以對View對象進行簡單的移動、旋轉(zhuǎn)、縮放和漸變等效果,幀動畫則提供了傳統(tǒng)的逐幀播放圖片的動畫方式。
還有些優(yōu)質(zhì)的文章推薦:
http://www.jianshu.com/p/6460d5788406
http://www.jianshu.com/p/7ba70e061bb4
屬性動畫(Property Animation)
概述
在android3.0中又引入了一個新的動畫系統(tǒng):property animation。
可通過NineOldAndroids項目在3.0之前的系統(tǒng)中使用Property Animation。
和視圖動畫的區(qū)別
視圖動畫只能作用于View,而且視圖動畫改變的只是View的繪制效果,View真正的屬性并沒有改變。
比如,一個按鈕做平移的動畫,雖然按鈕的確做了平移,但按鈕可點擊的區(qū)域并沒隨著平移而改變,還是在原來的位置。
示例:
在左上角有一個ImageView圖標(biāo),我們?yōu)槠湓O(shè)置了點擊監(jiān)聽事件,然后當(dāng)我們使用終止填充效果時,動畫結(jié)束后圖標(biāo)停留在最后的位置,此時,當(dāng)我們點擊圖標(biāo)時,是觸發(fā)不到點擊事件的,然而我們點擊圖標(biāo)原始位置時,卻觸發(fā)了點擊事件,由此可見按鈕可點擊的區(qū)域并沒隨著平移而改變,還是在原來的位置。
而屬性動畫則可以改變真正的屬性,從而實現(xiàn)按鈕平移時點擊區(qū)域也跟著平移。通俗點說,屬性動畫其實就是在一定時間內(nèi),按照一定規(guī)律來改變對象的屬性,從而使對象展現(xiàn)出動畫效果。
存放目錄res/animator
屬性動畫和視圖動畫一樣,可以通過xml文件定義。
不同的是:
- 視圖動畫的xml文件放于res/anim/目錄下,
- 屬性動畫的xml文件則放于res/animator/目錄下
- 一個是anim,一個是animator ,務(wù)必不要搞混了。
- 同樣的,在Java代碼里引用屬性動畫的xml文件時,則用R.animator.filename,不同于視圖動畫,引用時為R.anim.filename。
主要元素和類
屬性動畫主要有三個元素:<animator>、<objectAnimator>、<set>。
相對應(yīng)的有三個類:ValueAnimator、ObjectAnimator、AnimatorSet。
ValueAnimator是基本的動畫類,處理值動畫,通過監(jiān)聽某一值的變化,進行相應(yīng)的操作。
ObjectAnimator是ValueAnimator的子類,處理對象動畫。
AnimatorSet則為動畫集,可以組合另外兩種動畫或動畫集。
相應(yīng)的三個標(biāo)簽元素的關(guān)系也一樣。
<animator>標(biāo)簽
概述
<animator>標(biāo)簽與對應(yīng)的ValueAnimator類提供了屬性動畫的核心功能,包括計算動畫值、動畫時間細節(jié)、是否重復(fù)等。
執(zhí)行屬性動畫分兩個步驟:
ValuAnimiator只完成第一步,即只計算值,要實現(xiàn)第二步則需要在值變化的監(jiān)聽器里自行更新對象屬性。
通過<animator>標(biāo)簽可以很方便的對ValuAnimiator進行設(shè)置,可設(shè)置的屬性如下:
- android:duration 動畫從開始到結(jié)束持續(xù)的時長,單位為毫秒
- android:startOffset 設(shè)置動畫執(zhí)行之前的等待時長,單位為毫秒
- android:repeatCount 設(shè)置動畫重復(fù)執(zhí)行的次數(shù),默認為0,即不重復(fù);可設(shè)為-1或infinite,表示無限重復(fù)
- android:repeatMode 設(shè)置動畫重復(fù)執(zhí)行的模式,可設(shè)為以下兩個值其中之一:
1. restart 動畫重復(fù)執(zhí)行時從起點開始,默認為該值
2. reverse 動畫會反方向執(zhí)行 - android:valueFrom 動畫開始的值,可以為int值、float值或color值
- android:valueTo 動畫結(jié)束的值,可以為int值、float值或color值
android:valueType 動畫值類型,若為color值,則無需設(shè)置該屬性
- intType 指定動畫值,即以上兩個value屬性的值為整型
- floatType 指定動畫值,即以上兩個value屬性的值為浮點型,默認值
- android:interpolator 設(shè)置動畫速率的變化,比如加速、減速、勻速等,需要指定Interpolator資源 參考http://keeganlee.me/post/android/20151003。
示例
將一個按鈕的寬度進行縮放,從100%縮放到20%。
res/animator/value_animator.xml
可看到,值的變化從100到20,無限重復(fù),反方向執(zhí)行、動畫時長3000毫秒。
ValueAnimatorByXmlAct.java
import android.animation.AnimatorInflater; import android.animation.ValueAnimator; import android.annotation.TargetApi; import android.os.Build; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.DisplayMetrics; import android.view.View;import com.turing.base.R;public class ValueAnimatorByXmlAct extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_value_animator_by_xml);}@TargetApi(Build.VERSION_CODES.HONEYCOMB)public void onScaleWidth(final View view) {// 獲取屏幕寬帶DisplayMetrics metrics = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(metrics);final int width = metrics.widthPixels;/*** 屬性動畫則是通過AnimatorInflater類的loadAnimation()方法獲取相應(yīng)的Animator類實例。* 另外,ValueAnimator通過添加AnimatorUpdateListener監(jiān)聽器監(jiān)聽值的變化,從而再手動更新目標(biāo)對象的屬性。* 最后,通過調(diào)用valueAnimator.start()方法啟動動畫。*/ValueAnimator valueAnimator = (ValueAnimator) AnimatorInflater.loadAnimator(this, R.animator.value_animator);valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animator) {// 當(dāng)前動畫值,即為當(dāng)前寬度比例值int currentValue = (Integer) animator.getAnimatedValue();// 根據(jù)比例更改目標(biāo)view的寬度view.getLayoutParams().width = width * currentValue / 100;view.requestLayout();}});valueAnimator.start();} }<objectAnimator>標(biāo)簽
概述
<objectAnimator>標(biāo)簽對應(yīng)的類為ObjectAnimator,為ValueAnimator的子類。
<objectAnimator>標(biāo)簽與<animator>標(biāo)簽不同的是,<objectAnimator>可以直接指定動畫的目標(biāo)對象的屬性。
標(biāo)簽可設(shè)置的屬性除了和<animator>一樣的那些,另外多了一個:
- android:propertyName 目標(biāo)對象的屬性名,要求目標(biāo)對象必須提供該屬性的setter方法,如果動畫的時候沒有初始值,還需要提供getter方法
示例
還是用上面的例子,將一個按鈕的寬度進行縮放,從100%縮放到20%,但這次改用<objectAnimator>實現(xiàn)。
res/animtor/object_animator.xml
<?xml version="1.0" encoding="utf-8"?> <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"android:duration="3000"android:propertyName="width"android:repeatCount="infinite"android:repeatMode="reverse"android:valueFrom="100"android:valueTo="20"android:valueType="intType" />與<animator>的例子相比,就只是多了一個android:propertyName的屬性,設(shè)置值為width。也就是說,動畫改變的屬性為width,值將從100逐漸減到20。另外,值是從setWidth()傳遞過去的,再從getWidth()獲取。而且,這里設(shè)置的值代表的是比例值,因此,還需要進行計算轉(zhuǎn)化為實際的寬度值。最后,對象實際的寬度值為view.getLayoutParams().width。因此,我們用一個包裝類來包裝原始的view對象,對其提供setWidth()和getWidth()方法,代碼見Activity中的內(nèi)部類。
import android.animation.AnimatorInflater; import android.animation.ObjectAnimator; import android.annotation.TargetApi; import android.os.Build; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.DisplayMetrics; import android.view.View;import com.turing.base.R;public class ObjectAnimatorByXmlAct extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_object_animator_by_xml);}/*** Button點擊響應(yīng)事件** @param view*/@TargetApi(Build.VERSION_CODES.HONEYCOMB)public void onScaleWidth(View view) {// 獲取屏幕的寬度DisplayMetrics displayMetrics = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);final int width = displayMetrics.widthPixels;// 將目標(biāo)view進行包裝ViewWrapper wrapper = new ViewWrapper(view, width);// 將xml轉(zhuǎn)化為ObjectAnimator對象ObjectAnimator objectAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.object_animator);// 設(shè)置動畫的目標(biāo)對象為包裝后的viewobjectAnimator.setTarget(wrapper);// 啟動動畫objectAnimator.start();}/*** 與<animator>的例子相比,就只是多了一個android:propertyName的屬性,設(shè)置值為width。* 也就是說,動畫改變的屬性為width,值將從100逐漸減到20。* 另外,值是從setWidth()傳遞過去的,再從getWidth()獲取。* 而且,這里設(shè)置的值代表的是比例值,因此,還需要進行計算轉(zhuǎn)化為實際的寬度值。* 最后,對象實際的寬度值為view.getLayoutParams().width。* 因此,我將用一個包裝類來包裝原始的view對象,對其提供setWidth()和getWidth()方法*/private static class ViewWrapper {private View target;// 目標(biāo)對象private int maxWidth; //最長寬度值public ViewWrapper(View target, int maxWidth) {this.target = target;this.maxWidth = maxWidth;}public int getWidth() {return target.getLayoutParams().width;}public void setWidth(int widthValue) {//widthValue的值從100到20變化target.getLayoutParams().width = maxWidth * widthValue / 100;target.requestLayout();}} }setWidth()的代碼里,根據(jù)比例值轉(zhuǎn)化為了實際的寬度值。
動畫處理的代碼在onScaleWidth方法中。
activity_object_animator_by_xml.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.turing.base.android_hero.chapter6_Draw.annimation_propertyAnimation.ObjectAnimatorByXmlAct"><Button android:layout_width="match_parent"android:layout_height="wrap_content"android:text="點我"android:background="@drawable/bg_btn_normal"android:onClick="onScaleWidth"/></RelativeLayout>bg_btn_normal.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"><solid android:color="#2F90BD" /><padding android:bottom="12dp"android:left="12dp"android:right="12dp"android:top="12dp" /><corners android:radius="10dp" /> </shape>ObjectAnimator提供了屬性的設(shè)置,但相應(yīng)的需要有該屬性的setter和getter方法。而ValueAnimator則只是定義了值的變化,并不指定目標(biāo)屬性,所以也不需要提供setter和getter方法,但只能在AnimatorUpdateListener監(jiān)聽器里手動更新屬性。不過,也因為沒有指定屬性,所以其實更具靈活性了,你可以在監(jiān)聽器里根據(jù)值的變化做任何事情,比如更新多個屬性,比如在縮放寬度的同時做垂直移動。
為了對View更方便的設(shè)置屬性動畫,Android系統(tǒng)也提供了View的一些屬性和相應(yīng)的setter和getter方法:
- alpha:透明度,默認為1,表示不透明,0表示完全透明
- pivotX 和 pivotY:旋轉(zhuǎn)的軸點和縮放的基準(zhǔn)點,默認是View的中心點
- scaleX 和 scaleY:基于pivotX和pivotY的縮放,1表示無縮放,小于1表示收縮,大于1則放大
- rotation、rotationX 和 rotationY:基于軸點(pivotX和pivotY)的旋轉(zhuǎn),rotation為平面的旋轉(zhuǎn),rotationX和rotationY為立體的旋轉(zhuǎn)
- translationX 和 translationY:View的屏幕位置坐標(biāo)變化量,以layout容器的左上角為坐標(biāo)原點
- x 和 y:View在父容器內(nèi)的最終位置,是左上角坐標(biāo)和偏移量(translationX,translationY)的和。
<set>標(biāo)簽
<set>標(biāo)簽對應(yīng)于AnimatorSet類,可以將多個動畫組合成一個動畫集,如上面提到的在縮放寬度的同時做垂直移動,可以將一個縮放寬度的動畫和一個垂直移動的動畫組合在一起。
<set>標(biāo)簽有一個屬性可以設(shè)置動畫的時序關(guān)系:
- android:ordering 設(shè)置動畫的時序關(guān)系,取值可為以下兩個值之一:
1.together 動畫同時執(zhí)行,默認值 sequ
2.entially 動畫按順序執(zhí)行
那如果想有些動畫同時執(zhí)行,有些按順序執(zhí)行,該怎么辦呢?因為<set>標(biāo)簽是可以嵌套其他<set>標(biāo)簽的,也就是說可以將同時執(zhí)行的組合在一個<set>標(biāo)簽,再嵌在按順序執(zhí)行的<set>標(biāo)簽內(nèi)。
<!-- res/animator/animator_set.xml --> <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"android:ordering="together"><objectAnimator android:duration="3000"android:propertyName="width"android:valueFrom="100"android:valueTo="20"android:valueType="intType" /><objectAnimator android:duration="3000"android:propertyName="marginTop"android:valueFrom="0"android:valueTo="100"android:valueType="intType" /> </set>以上代碼可實現(xiàn)兩個同時執(zhí)行的動畫,一個將width從100縮放到20,一個將marginTop從0增加到100。多了一個marginTop屬性,那么,在ViewWrapper添加setMarginTop()方法,添加后的ViewWrapper類代碼如下:
private static class ViewWrapper {private View target;private int maxWidth;public ViewWrapper(View target, int maxWidth) {this.target = target;this.maxWidth = maxWidth;}public int getWidth() {return target.getLayoutParams().width;}public void setWidth(int widthValue) {target.getLayoutParams().width = maxWidth * widthValue / 100;target.requestLayout();}public void setMarginTop(int margin) {LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) target.getLayoutParams();layoutParams.setMargins(0, margin, 0, 0);target.setLayoutParams(layoutParams);} }最后,動畫處理的代碼:
public void onScaleWidth(View view) {// 獲取屏幕寬度int maxWidth = getWindowManager().getDefaultDisplay().getWidth();// 將目標(biāo)view進行包裝ViewWrapper wrapper = new ViewWrapper(view, maxWidth);// 將xml轉(zhuǎn)化為ObjectAnimator對象AnimatorSet animatorSet = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.animator_set);// 設(shè)置動畫的目標(biāo)對象為包裝后的viewanimatorSet.setTarget(wrapper);// 啟動動畫animatorSet.start(); }這樣就搞定了,實現(xiàn)了寬度縮放和垂直移動的效果。
總結(jié)
以上是生活随笔為你收集整理的Android动画效果-更新中的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android-2D绘图
- 下一篇: 记一次Weblogic连接池泄露的修复过