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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android动画效果-更新中

發(fā)布時(shí)間:2025/3/21 Android 66 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android动画效果-更新中 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

概述

Android系統(tǒng)提供了三種實(shí)現(xiàn)動畫的方式,一種是補(bǔ)間動畫(Tween Animation 在SDK中成為View Animation),另一種是幀動畫(Frame Animation 在SDK中稱為Drawable Animation) ,第三種 屬性動畫(property animation )。

  • 補(bǔ)間動畫可以實(shí)現(xiàn)View組件的移動、放大、縮小以及漸變等效果
  • 幀動畫則提供了一種逐幀播放圖片的動畫方式
  • 屬性動畫-補(bǔ)間動畫和幀動畫不能勝任復(fù)雜動畫,所以屬性動畫應(yīng)運(yùn)而生

無論是補(bǔ)間動畫還是幀動畫或者是屬性動畫,Android均為其進(jìn)行了封裝,提供了非常簡單的應(yīng)用接口。

3.0以前,android支持兩種動畫模式,tween animation,frame animation,在android3.0中又引入了一個(gè)新的動畫系統(tǒng):property animation。

這三種動畫模式在SDK中被稱為
view animation,
drawable animation,
property animation。

可通過NineOldAndroids項(xiàng)目在3.0之前的系統(tǒng)中使用Property Animation。


下面我們分別詳細(xì)的介紹下這三種動畫的使用。

補(bǔ)間動畫(Tween Animation/View Animation)

Animation類,動畫抽象類

Animation類是Android系統(tǒng)的一個(gè)動畫抽象類,所有其他一些動畫類都要繼承該類中的實(shí)現(xiàn)方法。Animation類主要用于補(bǔ)間動畫效果,提供了動畫啟動、停止、重復(fù)、持續(xù)時(shí)間等方法。Animation類中的方法適用于任何一種補(bǔ)間動畫對象。

setDuration方法:設(shè)置持續(xù)時(shí)間

【功能說明】該方法用于設(shè)置動畫的持續(xù)時(shí)間,以毫秒為單位。該方法是設(shè)置補(bǔ)間動畫時(shí)間長度的主要方法,使用非常普遍。

【基本語法】public void setDuration (long durationMillis)

其中,參數(shù)durationMillis為動畫的持續(xù)時(shí)間,單位為毫秒(ms)。

setDuration方法的示例可以參閱startNow方法中的示例代碼。

startNow方法:立刻啟動動畫

【功能說明】該方法用于啟動執(zhí)行一個(gè)動畫。該方法是啟動執(zhí)行動畫的主要方法,使用時(shí)需要先通過setAnimation方法為某一個(gè)View對象設(shè)置動畫。另外,用戶在程序中也可以使用View組件的startAnimation方法來啟動執(zhí)行動畫。

【基本語法】public void startNow ()

【實(shí)例演示】下面通過代碼來演示如何設(shè)置一個(gè)簡單的動畫效果。

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 動畫開始的點(diǎn)離當(dāng)前View X坐標(biāo)上的差值* float toXDelta 動畫結(jié)束的點(diǎn)離當(dāng)前View X坐標(biāo)上的差值* float fromYDelta 動畫開始的點(diǎn)離當(dāng)前View Y坐標(biāo)上的差值* float toYDelta 動畫開始的點(diǎn)離當(dāng)前View Y坐標(biāo)上的差值*/Animation translateAnimation = new TranslateAnimation(0, 200, 0, 200);// 設(shè)置動畫持續(xù)時(shí)間translateAnimation.setDuration(3000);// 為ImageView設(shè)置動畫效果mIdIvFace.setAnimation(translateAnimation);// 啟動動畫translateAnimation.startNow();}}

在這段代碼中,首先初始化了一個(gè)移動的動畫效果translateAnimation。然后,通過setDuration方法設(shè)置動畫持續(xù)時(shí)間,并為image對象設(shè)置動畫效果,最后使用startNow方法啟動動畫效果。
顯示效果:圖片將沿45 方向向右下角移動。


start方法:啟動動畫

【功能說明】該方法用于啟動執(zhí)行一個(gè)動畫。該方法是啟動執(zhí)行動畫的另一個(gè)主要方法,使用時(shí)需要先通過setAnimation方法為某一個(gè)View對象設(shè)置動畫。start方法區(qū)別于startNow方法的地方在于,start方法可以用于在getTransformation方法被調(diào)用時(shí)啟動動畫。

【基本語法】public void start ()

start方法的執(zhí)行效果類似于startNow方法,這里不再贅述。


cancel方法:取消動畫

【功能說明】該方法用于取消一個(gè)動畫的執(zhí)行。該方法是取得一個(gè)正在執(zhí)行中的動畫的主要方法。cancel方法和startNow方法結(jié)合可以實(shí)現(xiàn)對動畫執(zhí)行過程的控制。需要注意的是,通過cancel方法取消的動畫,必須使用reset方法或者setAnimation方法重新設(shè)置,才可以再次執(zhí)行動畫。

【基本語法】public void cancel ()

【實(shí)例演示】下面通過代碼來演示如何取消動畫效果執(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è)置動畫時(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;}} }

在這段代碼中,首先初始化了一個(gè)移動的動畫效果translateAnimation。然后,在第一個(gè)按鈕監(jiān)聽器中,通過setDuration方法設(shè)置動畫持續(xù)時(shí)間,并為image對象設(shè)置動畫效果,最后使用startNow方法啟動動畫效果。在第二個(gè)按鈕監(jiān)聽器中,調(diào)用cancel方法取消動畫執(zhí)行。

注意:

translateAnimation.startNow(); 2.3的版本 有效,高版本無效 .
mIdIvFlag.startAnimation(translateAnimation); 高版本和低版本都有效。


setRepeatCount方法:設(shè)置重復(fù)次數(shù)

【功能說明】該方法用于設(shè)置一個(gè)動畫效果重復(fù)執(zhí)行的次數(shù)。Android系統(tǒng)默認(rèn)每個(gè)動畫僅執(zhí)行一次,通過該方法可以設(shè)置動畫執(zhí)行多次。

【基本語法】public void setRepeatCount (int repeatCount)

其中,參數(shù)repeatCount為重復(fù)執(zhí)行的次數(shù)。如果設(shè)置為n,則動畫將執(zhí)行n+1次。

【實(shí)例演示】下面通過代碼來演示如何連續(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時(shí),將執(zhí)行setFillBefore和setFillAfter方法,否則將忽略setFillBefore和setFillAfter方法。

【基本語法】public void setFillEnabled (boolean fillEnabled)

其中,參數(shù)fillEnabled為是否使能填充效果,true表示使能該效果,false表示禁用該效果。

setFillEnabled方法的示例可以參閱setFillBefore方法和setFillAfter方法中的示例代碼。

setFillBefore方法:設(shè)置起始填充

【功能說明】該方法用于設(shè)置一個(gè)動畫效果執(zhí)行完畢后,View對象返回到起始的位置。該方法的效果是系統(tǒng)默認(rèn)的效果。該方法的執(zhí)行,需要首先通過setFillEnabled方法使能填充效果,否則設(shè)置無效。

【基本語法】public void setFillBefore (boolean fillBefore)

其中,參數(shù)fillBefore為是否執(zhí)行起始填充效果,true表示使能該效果,false表示禁用該效果。

【實(shí)例演示】下面通過代碼來演示如何讓View對象在動畫執(zhí)行完畢后回歸到起始位置。

//回歸起始位置 translateAnimation.setFillBefore(true); //使能填充效果 translateAnimation.setFillEnabled(true);

通過setFillBefore方法使對象回到起始點(diǎn),并使用setFillEnabled使能填充效果

當(dāng)點(diǎn)擊”START ANIMATION”按鈕時(shí),圖片開始移動,當(dāng)動畫結(jié)束之后,圖片將自動跳回到起始位置。(默認(rèn)效果)


setFillAfter方法:設(shè)置終止填充

【功能說明】該方法用于設(shè)置一個(gè)動畫效果執(zhí)行完畢后,View對象保留在終止的位置。該方法的執(zhí)行,需要首先通過setFillEnabled方法使能填充效果,否則設(shè)置無效。

【基本語法】public void setFillAfter (boolean fillAfter)

其中,參數(shù)fillAfter為是否執(zhí)行終止填充效果,true表示使能該效果,false表示禁用該效果。

【實(shí)例演示】下面通過代碼來演示如何讓View對象在動畫執(zhí)行完畢后保留在終止位置。

translateAnimation.setFillAfter (true); //保留在終止位置translateAnimation.setFillEnabled(true); //使能填充效果 ;

通過setFillAfter方法使對象保留在終止點(diǎn),并使用setFillEnabled使能填充效果。當(dāng)點(diǎn)擊”START ANIMATION”按鈕時(shí),圖片開始移動,當(dāng)動畫結(jié)束之后,圖片將停留在終止位置。


setRepeatMode方法:設(shè)置重復(fù)模式

【功能說明】該方法用于設(shè)置一個(gè)動畫效果執(zhí)行的重復(fù)模式。Android系統(tǒng)中提供了幾種重復(fù)模式,其中最主要的便是RESTART模式和REVERSE模式。

【基本語法】public void setRepeatMode (int repeatMode)

其中,參數(shù)repeatMode為動畫效果的重復(fù)模式,常用的取值如下。

RESTART:重新從頭開始執(zhí)行。

REVERSE:反方向執(zhí)行。

【實(shí)例演示】下面通過代碼來演示如何更改動畫路徑的方向。

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é)束之后,圖片將向反方向運(yùn)動。


setStartOffset方法:設(shè)置啟動時(shí)間

【功能說明】該方法用于設(shè)置一個(gè)動畫執(zhí)行的啟動時(shí)間,單位為毫秒。系統(tǒng)默認(rèn)當(dāng)執(zhí)行start方法后立刻執(zhí)行動畫,當(dāng)使用該方法設(shè)置后,將延遲一定的時(shí)間再啟動動畫。

【基本語法】public void setStartOffset (long startOffset)

其中,參數(shù)startOffset為動畫的啟動時(shí)間,單位為毫秒(ms)。

【實(shí)例演示】下面通過代碼來演示如何更改動畫的啟動時(shí)間。

translateAnimation.setStartOffset(3000); //設(shè)置啟動時(shí)間

通過setStartOffset方法設(shè)置動畫的啟動時(shí)間,當(dāng)點(diǎn)擊”START ANIMATION”按鈕時(shí),將等待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:位置變化的起始點(diǎn)X坐標(biāo)。

toXDelta:位置變化的結(jié)束點(diǎn)X坐標(biāo)。

fromYDelta:位置變化的起始點(diǎn)Y坐標(biāo)。

toYDelta:位置變化的結(jié)束點(diǎn)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í)例演示】下面通過代碼來演示如何設(shè)置一個(gè)簡單的旋轉(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ù)時(shí)間mIdIvFlag.setAnimation(rotateAnimation); //設(shè)置動畫mIdIvFlag.startAnimation(rotateAnimation); //啟動動畫break;case R.id.id_btn_stopAnimation1:// 取消動畫rotateAnimation.cancel();break;default:break;}} }

首先通過RotateAnimation構(gòu)造方法創(chuàng)建了一個(gè)旋轉(zhuǎn)變化的動畫對象。然后,在第一個(gè)按鈕監(jiān)聽器中設(shè)置了動畫的持續(xù)時(shí)間,之后啟動該動畫。在第二個(gè)按鈕監(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í)例演示】下面通過代碼來演示如何設(shè)置一個(gè)簡單的尺寸變化動畫效果。

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ù)時(shí)間mIdIvFlag.setAnimation(scaleAnimation); //設(shè)置動畫mIdIvFlag.startAnimation(scaleAnimation); //啟動動畫break;case R.id.id_btn_stopAnimation1:// 取消動畫scaleAnimation.cancel();break;default:break;}} }

首先通過ScaleAnimation構(gòu)造方法創(chuàng)建了一個(gè)尺寸變化的動畫對象。然后,在第一個(gè)按鈕監(jiān)聽器中設(shè)置了動畫的持續(xù)時(shí)間,之后啟動該動畫。在第二個(gè)按鈕監(jiān)聽器中取消該動畫。讀者運(yùn)行這段代碼,將看到圖片從小到大逐漸變化,最后,圖片增大到原始尺寸的時(shí)候停止。


AlphaAnimation類:透明度變化動畫類

AlphaAnimation類是Android系統(tǒng)中的透明度變化動畫類,用于控制View對象的透明度變化,該類繼承于Animation類。AlphaAnimation類中的很多方法都與Animation類一致,該類中最常用的方法便是AlphaAnimation構(gòu)造方法。

【基本語法】public AlphaAnimation (float fromAlpha, float toAlpha)

參數(shù)說明

fromAlpha:開始時(shí)刻的透明度,取值范圍0~1。

toAlpha:結(jié)束時(shí)刻的透明度,取值范圍0~1。

【實(shí)例演示】下面通過代碼來演示如何設(shè)置一個(gè)簡單的漸變透明度動畫效果。

這里寫代碼片

首先通過AlphaAnimation構(gòu)造方法創(chuàng)建了一個(gè)透明度變化的動畫對象。然后,在第一個(gè)按鈕監(jiān)聽器中設(shè)置了動畫的持續(xù)時(shí)間,之后啟動該動畫。在第二個(gè)按鈕監(jiān)聽器中取消該動畫。運(yùn)行這段代碼,將看到圖片的透明度由淺入深逐漸變化。最后,圖片變?yōu)橥耆煌该鞯臅r(shí)候停止。


AnimationSet類:動畫集合類

AnimationSet類是Android系統(tǒng)中的動畫集合類,用于控制View對象進(jìn)行多個(gè)動作的組合,該類繼承于Animation類。AnimationSet類中的很多方法都與Animation類一致,該類中最常用的方法便是addAnimation方法,該方法用于為動畫集合對象添加動畫對象。

【基本語法】public void addAnimation (Animation a)

其中,參數(shù)a為Animation動畫對象,可以是前述任何一種補(bǔ)間動作。

【實(shí)例演示】下面通過代碼來演示如何設(shè)置一個(gè)組合動畫效果。

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ù)時(shí)間scaleAnimation.setDuration(10000); //設(shè)置尺寸變化動畫的持續(xù)時(shí)間alphaAnimation.setDuration(10000); //設(shè)置透明度漸變動畫的持續(xù)時(shí)間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)造了位置變化、尺寸變化和透明度變化動畫的對象。然后,在第一個(gè)按鈕監(jiān)聽器中分別設(shè)置了動畫的持續(xù)時(shí)間,并通過addAnimation方法添加到動畫集中,之后啟動該動畫。
在第二個(gè)按鈕監(jiān)聽器中取消該動畫。

運(yùn)行這段代碼,將會看到顯示效果:圖片從小到大,由淺入深,從左上角向右下角移動。當(dāng)動畫結(jié)束的時(shí)候,圖片對象將停留在結(jié)束點(diǎn)的位置。


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。

【實(shí)例演示】下面通過代碼來演示如何加載一個(gè)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;}}}

首先聲明了動畫對象。然后,在第一個(gè)按鈕監(jiān)聽器中通過loadAnimation方法加載動畫配置文件,并設(shè)置了動畫的一些特征,最后開始執(zhí)行動畫。在第二個(gè)按鈕監(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)中的幀動畫類。幀動畫方式類似于放電影的原理,是通過順序播放多張圖片來實(shí)現(xiàn)動畫效果的,圖片之間有一定的動作連貫性,這樣人眼看來就像對象真正在運(yùn)動一樣。AnimationDrawable類位于android.graphics.drawable軟件包中,本節(jié)將介紹幀動畫類中的主要編程方法。

start方法:開始動畫

【功能說明】該方法用于開始動畫執(zhí)行,其是幀動畫效果執(zhí)行的主要方法。

【基本語法】public void start ()

【實(shí)例演示】下面通過代碼來演示如何實(shí)現(xiàn)一個(gè)簡單的幀動畫。

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目錄下新建一個(gè)幀動畫配置文件,并將其設(shè)置為圖片控件的背景。幀動畫配置文件的內(nèi)容如下:

<?xml version="1.0" encoding="utf-8"?><!--根標(biāo)簽為animation-list,其中oneshot代表著是否只展示一遍,設(shè)置為false會不停的循環(huán)播放動畫根標(biāo)簽下,通過item標(biāo)簽對動畫中的每一個(gè)圖片進(jìn)行聲明android:duration 表示展示所用的該圖片的時(shí)間長度--> <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 ()

【實(shí)例演示】下面通過代碼來演示如何實(shí)現(xiàn)一個(gè)簡單的幀動畫。

@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ā)這個(gè)動畫,要程序運(yùn)行即播放動畫,怎么做呢?
最好是在onWindowFocusChanged這個(gè)方法中啟動動畫。因?yàn)樵趏nCreate中啟動動畫, AnimationDrawable有可能還沒有完全attach 到Window上


addFrame方法:添加動畫幀

【功能說明】該方法用于為幀動畫對象添加動畫幀。該方法主要用于動態(tài)修改幀動畫內(nèi)容的場合,可以根據(jù)需要增加一些動畫幀。

【基本語法】public void addFrame (Drawable frame, int duration)

參數(shù)說明

frame:動畫幀的Drawable對象。

duration:動畫幀的持續(xù)時(shí)間,單位為毫秒。

【實(shí)例演示】下面通過代碼來演示如何實(shí)現(xiàn)一個(gè)簡單的幀動畫。

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;}}}

首先聲明了幀動畫對象。然后,在第一個(gè)按鈕監(jiān)聽器中使用addFrame方法添加了動畫幀,之后直接調(diào)用start方法來開始動畫執(zhí)行,在第二個(gè)按鈕監(jiān)聽器中直接調(diào)用stop方法來停止動畫執(zhí)行


setOneShot方法:設(shè)置播放方式

【功能說明】該方法用于設(shè)置幀動畫的播放方式,可以是單次播放,也可以是循環(huán)播放。在系統(tǒng)默認(rèn)情況下采用的是單次播放的方式。該方法主要用于循環(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ù)

【功能說明】該方法用于獲取動畫的幀個(gè)數(shù),也就是按照順序播放了幾張圖片。該方法常常用于獲取幀動畫對象特性的場合。

【基本語法】public int getNumberOfFrames ()

【實(shí)例演示】下面通過代碼來演示如何獲取幀動畫播放幀的個(gè)數(shù)。

int num; ad.start(); //開始動畫 num=ad.getNumberOfFrames(); //獲取幀數(shù) Toast.makeText(getApplicationContext(), "當(dāng)前動畫需要播放"+num+"幀", Toast.LENGTH_LONG).show(); //顯示 }


小結(jié)

動畫技術(shù)能夠給應(yīng)用程序帶來豐富的特效,增強(qiáng)用戶體驗(yàn)。Android3.0之前的SDK提供了兩種動畫實(shí)現(xiàn)方式,補(bǔ)間動畫(Tween Animation)和幀動畫(Frame Animation)。補(bǔ)間動畫可以對View對象進(jìn)行簡單的移動、旋轉(zhuǎn)、縮放和漸變等效果,幀動畫則提供了傳統(tǒng)的逐幀播放圖片的動畫方式。


還有些優(yōu)質(zhì)的文章推薦:
http://www.jianshu.com/p/6460d5788406
http://www.jianshu.com/p/7ba70e061bb4


屬性動畫(Property Animation)

概述

在android3.0中又引入了一個(gè)新的動畫系統(tǒng):property animation。

可通過NineOldAndroids項(xiàng)目在3.0之前的系統(tǒng)中使用Property Animation。

和視圖動畫的區(qū)別

視圖動畫只能作用于View,而且視圖動畫改變的只是View的繪制效果,View真正的屬性并沒有改變。

比如,一個(gè)按鈕做平移的動畫,雖然按鈕的確做了平移,但按鈕可點(diǎn)擊的區(qū)域并沒隨著平移而改變,還是在原來的位置。

示例:
在左上角有一個(gè)ImageView圖標(biāo),我們?yōu)槠湓O(shè)置了點(diǎn)擊監(jiān)聽事件,然后當(dāng)我們使用終止填充效果時(shí),動畫結(jié)束后圖標(biāo)停留在最后的位置,此時(shí),當(dāng)我們點(diǎn)擊圖標(biāo)時(shí),是觸發(fā)不到點(diǎn)擊事件的,然而我們點(diǎn)擊圖標(biāo)原始位置時(shí),卻觸發(fā)了點(diǎn)擊事件,由此可見按鈕可點(diǎn)擊的區(qū)域并沒隨著平移而改變,還是在原來的位置。

而屬性動畫則可以改變真正的屬性,從而實(shí)現(xiàn)按鈕平移時(shí)點(diǎn)擊區(qū)域也跟著平移。通俗點(diǎn)說,屬性動畫其實(shí)就是在一定時(shí)間內(nèi),按照一定規(guī)律來改變對象的屬性,從而使對象展現(xiàn)出動畫效果。

存放目錄res/animator

屬性動畫和視圖動畫一樣,可以通過xml文件定義。

不同的是:

  • 視圖動畫的xml文件放于res/anim/目錄下,
  • 屬性動畫的xml文件則放于res/animator/目錄下
  • 一個(gè)是anim,一個(gè)是animator ,務(wù)必不要搞混了。
  • 同樣的,在Java代碼里引用屬性動畫的xml文件時(shí),則用R.animator.filename,不同于視圖動畫,引用時(shí)為R.anim.filename。

主要元素和類

屬性動畫主要有三個(gè)元素:<animator>、<objectAnimator>、<set>。
相對應(yīng)的有三個(gè)類:ValueAnimator、ObjectAnimator、AnimatorSet

ValueAnimator是基本的動畫類,處理值動畫,通過監(jiān)聽某一值的變化,進(jìn)行相應(yīng)的操作。

ObjectAnimator是ValueAnimator的子類,處理對象動畫。

AnimatorSet則為動畫集,可以組合另外兩種動畫或動畫集。

相應(yīng)的三個(gè)標(biāo)簽元素的關(guān)系也一樣。

<animator>標(biāo)簽

概述

<animator>標(biāo)簽與對應(yīng)的ValueAnimator類提供了屬性動畫的核心功能,包括計(jì)算動畫值、動畫時(shí)間細(xì)節(jié)、是否重復(fù)等。

執(zhí)行屬性動畫分兩個(gè)步驟:

  • 計(jì)算動畫值
  • 將動畫值應(yīng)用到對象和屬性上
  • ValuAnimiator只完成第一步,即只計(jì)算值,要實(shí)現(xiàn)第二步則需要在值變化的監(jiān)聽器里自行更新對象屬性。

    通過<animator>標(biāo)簽可以很方便的對ValuAnimiator進(jìn)行設(shè)置,可設(shè)置的屬性如下:

    • android:duration 動畫從開始到結(jié)束持續(xù)的時(shí)長,單位為毫秒
    • android:startOffset 設(shè)置動畫執(zhí)行之前的等待時(shí)長,單位為毫秒
    • android:repeatCount 設(shè)置動畫重復(fù)執(zhí)行的次數(shù),默認(rèn)為0,即不重復(fù);可設(shè)為-1或infinite,表示無限重復(fù)
    • android:repeatMode 設(shè)置動畫重復(fù)執(zhí)行的模式,可設(shè)為以下兩個(gè)值其中之一:
      1. restart 動畫重復(fù)執(zhí)行時(shí)從起點(diǎn)開始,默認(rèn)為該值
      2. reverse 動畫會反方向執(zhí)行
    • android:valueFrom 動畫開始的值,可以為int值、float值或color值
    • android:valueTo 動畫結(jié)束的值,可以為int值、float值或color值
    • android:valueType 動畫值類型,若為color值,則無需設(shè)置該屬性

    • intType 指定動畫值,即以上兩個(gè)value屬性的值為整型
    • floatType 指定動畫值,即以上兩個(gè)value屬性的值為浮點(diǎn)型,默認(rèn)值
    • android:interpolator 設(shè)置動畫速率的變化,比如加速、減速、勻速等,需要指定Interpolator資源 參考http://keeganlee.me/post/android/20151003。

    示例

    將一個(gè)按鈕的寬度進(jìn)行縮放,從100%縮放到20%。

    res/animator/value_animator.xml

    <?xml version="1.0" encoding="utf-8"?> <animator xmlns:android="http://schemas.android.com/apk/res/android"android:duration="3000"android:repeatCount="infinite"android:repeatMode="reverse"android:valueFrom="100"android:valueTo="20"android:valueType="intType"/>

    可看到,值的變化從100到20,無限重復(fù),反方向執(zhí)行、動畫時(shí)長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類實(shí)例。* 另外,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>一樣的那些,另外多了一個(gè):

    • android:propertyName 目標(biāo)對象的屬性名,要求目標(biāo)對象必須提供該屬性的setter方法,如果動畫的時(shí)候沒有初始值,還需要提供getter方法

    示例

    還是用上面的例子,將一個(gè)按鈕的寬度進(jìn)行縮放,從100%縮放到20%,但這次改用<objectAnimator>實(shí)現(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>的例子相比,就只是多了一個(gè)android:propertyName的屬性,設(shè)置值為width。也就是說,動畫改變的屬性為width,值將從100逐漸減到20。另外,值是從setWidth()傳遞過去的,再從getWidth()獲取。而且,這里設(shè)置的值代表的是比例值,因此,還需要進(jìn)行計(jì)算轉(zhuǎn)化為實(shí)際的寬度值。最后,對象實(shí)際的寬度值為view.getLayoutParams().width。因此,我們用一個(gè)包裝類來包裝原始的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點(diǎn)擊響應(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進(jìn)行包裝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>的例子相比,就只是多了一個(gè)android:propertyName的屬性,設(shè)置值為width。* 也就是說,動畫改變的屬性為width,值將從100逐漸減到20。* 另外,值是從setWidth()傳遞過去的,再從getWidth()獲取。* 而且,這里設(shè)置的值代表的是比例值,因此,還需要進(jìn)行計(jì)算轉(zhuǎn)化為實(shí)際的寬度值。* 最后,對象實(shí)際的寬度值為view.getLayoutParams().width。* 因此,我將用一個(gè)包裝類來包裝原始的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)化為了實(shí)際的寬度值。
    動畫處理的代碼在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="點(diǎn)我"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)聽器里手動更新屬性。不過,也因?yàn)闆]有指定屬性,所以其實(shí)更具靈活性了,你可以在監(jiān)聽器里根據(jù)值的變化做任何事情,比如更新多個(gè)屬性,比如在縮放寬度的同時(shí)做垂直移動。

    為了對View更方便的設(shè)置屬性動畫,Android系統(tǒng)也提供了View的一些屬性和相應(yīng)的setter和getter方法:

    • alpha:透明度,默認(rèn)為1,表示不透明,0表示完全透明
    • pivotX 和 pivotY:旋轉(zhuǎn)的軸點(diǎn)和縮放的基準(zhǔn)點(diǎn),默認(rèn)是View的中心點(diǎn)
    • scaleX 和 scaleY:基于pivotX和pivotY的縮放,1表示無縮放,小于1表示收縮,大于1則放大
    • rotation、rotationX 和 rotationY:基于軸點(diǎn)(pivotX和pivotY)的旋轉(zhuǎn),rotation為平面的旋轉(zhuǎn),rotationX和rotationY為立體的旋轉(zhuǎn)
    • translationX 和 translationY:View的屏幕位置坐標(biāo)變化量,以layout容器的左上角為坐標(biāo)原點(diǎn)
    • x 和 y:View在父容器內(nèi)的最終位置,是左上角坐標(biāo)和偏移量(translationX,translationY)的和。

    <set>標(biāo)簽

    <set>標(biāo)簽對應(yīng)于AnimatorSet類,可以將多個(gè)動畫組合成一個(gè)動畫集,如上面提到的在縮放寬度的同時(shí)做垂直移動,可以將一個(gè)縮放寬度的動畫和一個(gè)垂直移動的動畫組合在一起。
    <set>標(biāo)簽有一個(gè)屬性可以設(shè)置動畫的時(shí)序關(guān)系:

    • android:ordering 設(shè)置動畫的時(shí)序關(guān)系,取值可為以下兩個(gè)值之一:

    1.together 動畫同時(shí)執(zhí)行,默認(rèn)值 sequ
    2.entially 動畫按順序執(zhí)行

    那如果想有些動畫同時(shí)執(zhí)行,有些按順序執(zhí)行,該怎么辦呢?因?yàn)?lt;set>標(biāo)簽是可以嵌套其他<set>標(biāo)簽的,也就是說可以將同時(shí)執(zhí)行的組合在一個(gè)<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>

    以上代碼可實(shí)現(xiàn)兩個(gè)同時(shí)執(zhí)行的動畫,一個(gè)將width從100縮放到20,一個(gè)將marginTop從0增加到100。多了一個(gè)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進(jìn)行包裝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(); }

    這樣就搞定了,實(shí)現(xiàn)了寬度縮放和垂直移動的效果。

    總結(jié)

    以上是生活随笔為你收集整理的Android动画效果-更新中的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。