android 幀動(dòng)畫,補(bǔ)間動(dòng)畫,屬性動(dòng)畫的簡(jiǎn)單總結(jié)
幀動(dòng)畫——FrameAnimation
將一系列圖片有序播放,形成動(dòng)畫的效果。其本質(zhì)是一個(gè)Drawable,是一系列圖片的集合,本身可以當(dāng)做一個(gè)圖片一樣使用
在Drawable文件夾下,創(chuàng)建animation-list為根節(jié)點(diǎn)的資源文件
<animation-list android:oneshot="false"> <item android:drawable="@drawable/img1" android:duration="100"/> <item android:drawable="@drawable/img2" android:duration="100"/> <item android:drawable="@drawable/img3" android:duration="100"/> <item android:drawable="@drawable/img4" android:duration="100"/> </animation-list>
oneshot:是否只播放一次
drawable:一幀引用的圖片
duration:一幀播放的時(shí)間
播放動(dòng)畫
將動(dòng)畫作為控件的背景
((AnimationDrawable)view.getBackground()).start();
Animation常用屬性
duration:動(dòng)畫時(shí)間
repeatCount:重復(fù)次數(shù) infinite無(wú)限次
fillAfter:是否停止在最后一幀
repeatMode:重復(fù)模式 值:restart重新開始,reserve反復(fù)
startOffset:開始延遲時(shí)間
補(bǔ)間動(dòng)畫 Tween Animation
只能應(yīng)用于View對(duì)象,只支持部分屬性,View animation值改變了View繪制的位置,并沒有改變對(duì)象本身的真實(shí)位置
可以使用XML定義也可以使用代碼定義 XML定義的動(dòng)畫放在/res/anim/文件夾內(nèi)
開始動(dòng)畫 通過view的startAnimation(Animation a) 參數(shù)定義的動(dòng)畫
四種補(bǔ)間動(dòng)畫通過XML定義
AlphaAnimation:透明度動(dòng)畫
<?xml version="1.0" encoding="utf-8"?> <alpha xmlns:android="http://schemas.android.com/apk/res/android" android:fromAlpha="0" android:toAlpha="1" android:duration="2000"> <!-- fromAlpha 起始透明度 0為完全透明 1為不透明 0~1之間的浮點(diǎn)值 toAlpha 結(jié)束透明度 duration 動(dòng)畫運(yùn)行時(shí)間 單位毫秒 --> </alpha>
AlphaAnimation alphaAnimation=null; //加載XML中的動(dòng)畫XML文件 alphaAnimation= (AlphaAnimation) AnimationUtils.loadAnimation(MainActivity.this, R.anim.anim_alpha); //常用屬性設(shè)置 各種動(dòng)畫通用 alphaAnimation.setRepeatCount(3);//執(zhí)行動(dòng)畫效果結(jié)束后重復(fù)執(zhí)行3次 一共4次 alphaAnimation.setRepeatMode(Animation.REVERSE);//重復(fù)模式 //動(dòng)畫結(jié)束是否停止在最后一幀 alphaAnimation.setFillAfter(true); //動(dòng)畫結(jié)束是否停止在第一幀 alphaAnimation.setFillBefore(false); //設(shè)置插值器 動(dòng)畫執(zhí)行速度 變速 加減速。。 //AccelerateInterpolator減速 //DecelerateInterpolator加速 alphaAnimation.setInterpolator(new AccelerateDecelerateInterpolator());
ScaleAnimation:縮放動(dòng)畫
代碼加載的方式和方法的使用與AlphaAnimation一樣
<?xml version="1.0" encoding="utf-8"?> <scale xmlns:android="http://schemas.android.com/apk/res/android" android:toXScale="1" android:toYScale="1" android:fromXScale="0.1" android:fromYScale="0.1" android:pivotY="0%" android:pivotX="0%" android:duration="2000"> <!-- 浮點(diǎn)值 表示倍數(shù) 自身幾倍 fromXScale 動(dòng)畫在X軸以自身幾倍伸縮開始 toXScale 動(dòng)畫在X軸以自身幾倍伸縮結(jié)束 fromYScale 動(dòng)畫在Y軸以自身幾倍伸縮開始 toYScale 動(dòng)畫在Y軸以自身幾倍伸縮結(jié)束 pivotX 動(dòng)畫相對(duì)于控件自身的X坐標(biāo)的開始位置 pivotY 動(dòng)畫相對(duì)于控件自身的Y坐標(biāo)的開始位置 0% 0% 表示控件左上角 為0,0原點(diǎn)坐標(biāo) --> </scale>
TranslateAnimation:平移動(dòng)畫
<?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="-100%p" android:fromYDelta="0" android:toXDelta="100%p" android:toYDelta="0" android:duration="2000"> <!-- fromXDelta x軸起始位置 toXDelta X軸結(jié)束位置 fromYDelta y軸起始位置 toYDelta y軸結(jié)束位置 100%p 表示相對(duì)于父級(jí) 100%相對(duì)于自身 --> </translate>
RotateAnimation:旋轉(zhuǎn)動(dòng)畫
<?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="0" android:toDegrees="360" android:duration="2000" android:pivotX="50%" android:pivotY="50%" android:interpolator="@android:anim/accelerate_decelerate_interpolator"> <!-- interpolator 指定動(dòng)畫的插值器 accelerate_decelerate_interpolator 加速-減速 accelerate_interpolator 加速 decelerate_interpolator 減速 fromDegrees 動(dòng)畫起始角度 toDegrees 動(dòng)畫結(jié)束旋轉(zhuǎn)的角度 可以大于360度 負(fù)數(shù)表示逆時(shí)針旋轉(zhuǎn) 正數(shù)表示順時(shí)針旋轉(zhuǎn) pivotX相對(duì)于view的X坐標(biāo)的開始位置 pivotY相對(duì)于view的Y坐標(biāo)的開始位置 絕對(duì)尺寸 100px 50% 相對(duì)尺寸 相對(duì)于自身的50% 50%p 相對(duì)尺寸 相對(duì)于父容器的50% 50%為物件的X或Y方向坐標(biāo)上的中點(diǎn)位置 duration 動(dòng)畫播放時(shí)間 單位毫秒 --> </rotate>
通過構(gòu)造方法創(chuàng)建
構(gòu)造參數(shù)詳解 此段內(nèi)容選自 http://www.cnblogs.com/aimeng/archive/2011/10/10/2206710.html
//在代碼中定義 動(dòng)畫實(shí)例對(duì)象 private Animation myAnimation_Alpha; private Animation myAnimation_Scale; private Animation myAnimation_Translate; private Animation myAnimation_Rotate; //根據(jù)各自的構(gòu)造方法來初始化一個(gè)實(shí)例對(duì)象 myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f); myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); myAnimation_Translate=new TranslateAnimation(30.0f, -80.0f, 30.0f, 300.0f); myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
AlphaAnimation
AnimationAlphaAnimation(float fromAlpha, float toAlpha) //第一個(gè)參數(shù)fromAlpha為 動(dòng)畫開始時(shí)候透明度 //第二個(gè)參數(shù)toAlpha為 動(dòng)畫結(jié)束時(shí)候透明度 myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f); //說明: // 0.0表示完全透明 // 1.0表示完全不透明 myAnimation_Alpha.setDuration(5000); //設(shè)置時(shí)間持續(xù)時(shí)間為 5000毫秒
ScaleAnimation
ScaleAnimation(float fromX, float toX, float fromY, float toY,
int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
//第一個(gè)參數(shù)fromX為動(dòng)畫起始時(shí) X坐標(biāo)上的伸縮尺寸
//第二個(gè)參數(shù)toX為動(dòng)畫結(jié)束時(shí) X坐標(biāo)上的伸縮尺寸
//第三個(gè)參數(shù)fromY為動(dòng)畫起始時(shí)Y坐標(biāo)上的伸縮尺寸
//第四個(gè)參數(shù)toY為動(dòng)畫結(jié)束時(shí)Y坐標(biāo)上的伸縮尺寸
/*說明:
以上四種屬性值
0.0表示收縮到?jīng)]有
1.0表示正常無(wú)伸縮
值小于1.0表示收縮
值大于1.0表示放大
*/
//第五個(gè)參數(shù)pivotXType為動(dòng)畫在X軸相對(duì)于物件位置類型
//第六個(gè)參數(shù)pivotXValue為動(dòng)畫相對(duì)于物件的X坐標(biāo)的開始位置
//第七個(gè)參數(shù)pivotXType為動(dòng)畫在Y軸相對(duì)于物件位置類型
//第八個(gè)參數(shù)pivotYValue為動(dòng)畫相對(duì)于物件的Y坐標(biāo)的開始位置
myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
myAnimation_Scale.setDuration(700);
//設(shè)置時(shí)間持續(xù)時(shí)間為 700毫秒
TranslateAnimation
TranslateAnimation(float fromXDelta, float toXDelta,
float fromYDelta, float toYDelta)
//第一個(gè)參數(shù)fromXDelta為動(dòng)畫起始時(shí) X坐標(biāo)上的移動(dòng)位置
//第二個(gè)參數(shù)toXDelta為動(dòng)畫結(jié)束時(shí) X坐標(biāo)上的移動(dòng)位置
//第三個(gè)參數(shù)fromYDelta為動(dòng)畫起始時(shí)Y坐標(biāo)上的移動(dòng)位置
//第四個(gè)參數(shù)toYDelta為動(dòng)畫結(jié)束時(shí)Y坐標(biāo)上的移動(dòng)位置
RotateAnimation
RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) //第一個(gè)參數(shù)fromDegrees為動(dòng)畫起始時(shí)的旋轉(zhuǎn)角度 //第二個(gè)參數(shù)toDegrees為動(dòng)畫旋轉(zhuǎn)到的角度 //第三個(gè)參數(shù)pivotXType為動(dòng)畫在X軸相對(duì)于物件位置類型 //第四個(gè)參數(shù)pivotXValue為動(dòng)畫相對(duì)于物件的X坐標(biāo)的開始位置 //第五個(gè)參數(shù)pivotXType為動(dòng)畫在Y軸相對(duì)于物件位置類型 //第六個(gè)參數(shù)pivotYValue為動(dòng)畫相對(duì)于物件的Y坐標(biāo)的開始位置 myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
屬性動(dòng)畫
相對(duì)補(bǔ)間動(dòng)畫 屬性動(dòng)畫會(huì)真正的使目標(biāo)對(duì)象的屬性值發(fā)生改變,不像補(bǔ)間動(dòng)畫只是影像的改變 只能修改具有g(shù)et/set方法的屬性值
因?yàn)榭梢孕薷膶?duì)象的屬性,屬性動(dòng)畫可以做到更多的效果,改變文本大小,背景顏色等等
屬性動(dòng)畫創(chuàng)建在 res/animator
ValueAnimator
包含屬性動(dòng)畫的所有核心功能,動(dòng)畫時(shí)間,開始、結(jié)束屬性值,屬性值計(jì)算方法等。
ValuAnimiator設(shè)置開始結(jié)束值 實(shí)現(xiàn)ValueAnimator.onUpdateListener接口,
這個(gè)接口只有一個(gè)函數(shù)onAnimationUpdate(),在這個(gè)函數(shù)中會(huì)傳入ValueAnimator對(duì)象做為參數(shù),通過這個(gè)ValueAnimator對(duì)象的getAnimatedValue()函數(shù)可以得到當(dāng)前的屬性值
把屬性值設(shè)置給某個(gè)控件的某個(gè)屬性
使用xml
<?xml version="1.0" encoding="utf-8"?> <animator xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:valueFrom="0" android:valueTo="300" android:valueType="intType" android:interpolator="@android:interpolator/overshoot"> <!-- valueFrom 起始值 valueTo 結(jié)束值 valueType 值的類型 intType整數(shù)值、floatType浮點(diǎn)值、colorType顏色值 interpolator插值器 --> </animator>
ValueAnimator valueAnimator=null; //通過AnimatorInflater.loadAnimator()加載xml 創(chuàng)建ValueAnimator valueAnimator= (ValueAnimator) AnimatorInflater.loadAnimator(this,R.animator.animator_value); //動(dòng)畫執(zhí)行時(shí)間 valueAnimator.setDuration(3000); //值改變監(jiān)聽 valueAnimator.addUpdateListener(listener); //開始動(dòng)畫 valueAnimator.start();
private ValueAnimator.AnimatorUpdateListener listener=new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//獲取值
int value= (int) animation.getAnimatedValue();
//btnValueAnimator為測(cè)試控件
//設(shè)置控件X軸平移
btnValueAnimator.setTranslationX(value);
}
};
使用代碼
/**
* valueAnimator 單個(gè)值
*/
//代碼創(chuàng)建 ValueAnimator類自身的方法
//ofFloat值類型float
ValueAnimator valueAnimator=ValueAnimator.ofFloat(0,1);
//ofInt值類型int 從0~300
valueAnimator=ValueAnimator.ofInt(0,300);
//也可以用來設(shè)置顏色 在顏色改變過程中會(huì)將顏色變化情況顯示出來
//紅色到藍(lán)色的改變過程 顯示N種顏色
valueAnimator=ValueAnimator.ofInt(Color.RED,Color.BLUE);
//ofArgb設(shè)置顏色 如果無(wú)法使用 是的sdk版本低了
//這個(gè)方法改變顏色過程中只顯示紅色和藍(lán)色
//valueAnimator=ValueAnimator.ofArgb(Color.RED,Color.BLUE);
//設(shè)置插值器
valueAnimator.setInterpolator(new CycleInterpolator());
/**
*
* ValueAnimator.ofPropertyValuesHolder 設(shè)置多個(gè)值
*/
//設(shè)置動(dòng)畫屬性 參數(shù)1:名字 參數(shù)2,3值的變化區(qū)間
PropertyValuesHolder alphaHolder=PropertyValuesHolder.ofFloat("alpha",0f,1f);
PropertyValuesHolder widthHolder=PropertyValuesHolder.ofInt("width",0,300);
//ValueAnimator.ofPropertyValuesHolder 添加holder 創(chuàng)建動(dòng)畫
valueAnimator=ValueAnimator.ofPropertyValuesHolder(alphaHolder,widthHolder);
//動(dòng)畫執(zhí)行時(shí)間
valueAnimator.setDuration(3000);
//值改變監(jiān)聽
valueAnimator.addUpdateListener(listener);
private ValueAnimator.AnimatorUpdateListener listener=new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
/**
* 單個(gè)值獲取 getAnimatedValue取出變化值 根據(jù)設(shè)置類型強(qiáng)轉(zhuǎn)
* btnValueAnimator 測(cè)試用的button
*/
// int value= (int) animation.getAnimatedValue();
// btnValueAnimator.setTranslationX(value);橫坐標(biāo)平移
// float value= (float) valueAnimator.getAnimatedValue();
// btnValueAnimator.setAlpha(value);透明度改變
// int value= (int) animation.getAnimatedValue();
// btnValueAnimator.setTextColor(value);文字顏色改變
/**
* PropertyValuesHolder存了多個(gè)值 通過名字獲取 強(qiáng)制轉(zhuǎn)換
*/
float alpha= (float) valueAnimator.getAnimatedValue("alpha");
int width= (int) valueAnimator.getAnimatedValue("width");
btnValueAnimator.setAlpha(alpha);//改變透明度
//圖像繪制 左邊不變從右邊慢慢增加
//修改控件的width height不能使用setWidth或setHeight
btnValueAnimator.setRight(width);
//btnValueAnimator.setBottom(width);
}
};
ObjectAnimator:
繼承自ValueAnimator,要指定一個(gè)對(duì)象及該對(duì)象的一個(gè)屬性,當(dāng)屬性值計(jì)算完成時(shí)自動(dòng)設(shè)置為該對(duì)象的相應(yīng)屬性,不需要設(shè)置監(jiān)聽,底層自動(dòng)完成,一般會(huì)用ObjectAnimator來改變某一對(duì)象的某一屬性
//用來測(cè)試的button
Button btnObjectAnimator= (Button) findViewById(R.id.btn_object_animator);
//加載動(dòng)畫
ObjectAnimator objectAnimator= (ObjectAnimator) AnimatorInflater.loadAnimator(this,R.animator.animator_object);
//綁定控件
objectAnimator.setTarget(btnObjectAnimator);
//參數(shù)1 綁定控件 參數(shù)2 設(shè)置 屬性 參數(shù)3 設(shè)置值
objectAnimator=ObjectAnimator.ofInt(btnObjectAnimator,"textColor",Color.RED);
//PropertyValuesHolder設(shè)置多個(gè)屬性
PropertyValuesHolder translationXHolder=PropertyValuesHolder.ofFloat("translationX",0,300);
PropertyValuesHolder translationYHolder=PropertyValuesHolder.ofFloat("translationY",0,200);
objectAnimator=ObjectAnimator.ofPropertyValuesHolder(btnObjectAnimator,translationXHolder,translationYHolder);
objectAnimator.setDuration(3000);
//開始動(dòng)畫
objectAnimator.start();
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
- Android Studio實(shí)現(xiàn)補(bǔ)間動(dòng)畫
- Android動(dòng)畫系列之幀動(dòng)畫和補(bǔ)間動(dòng)畫的示例代碼
- Android動(dòng)畫學(xué)習(xí)筆記之補(bǔ)間動(dòng)畫
- Android補(bǔ)間動(dòng)畫基本使用(位移、縮放、旋轉(zhuǎn)、透明)
- Android旋轉(zhuǎn)、平移、縮放和透明度漸變的補(bǔ)間動(dòng)畫
- Android控件Tween動(dòng)畫(補(bǔ)間動(dòng)畫)實(shí)現(xiàn)方法示例
- Android幀動(dòng)畫、補(bǔ)間動(dòng)畫、屬性動(dòng)畫用法詳解
- Android動(dòng)畫之補(bǔ)間動(dòng)畫(Tween Animation)基礎(chǔ)學(xué)習(xí)
- Android動(dòng)畫之補(bǔ)間動(dòng)畫(Tween Animation)實(shí)例詳解
- Android?Studio實(shí)現(xiàn)簡(jiǎn)單補(bǔ)間動(dòng)畫
相關(guān)文章
Android 通過騰訊TBS實(shí)現(xiàn)文件預(yù)覽功能
這篇文章主要介紹了Android 通過騰訊TBS實(shí)現(xiàn)文件預(yù)覽功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
Android實(shí)現(xiàn)用戶圓形頭像和模糊背景
這篇文章主要介紹了Android實(shí)現(xiàn)用戶圓形頭像和模糊背景 ,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04
Android Flutter實(shí)現(xiàn)仿閑魚動(dòng)畫效果
目前正在做的項(xiàng)目,為了增加用戶的體驗(yàn)度,準(zhǔn)備增加一些動(dòng)畫效果。本文將通過Android Flutter實(shí)現(xiàn)仿閑魚動(dòng)畫效果,感興趣的可以嘗試一下2023-02-02
Flutter實(shí)現(xiàn)倒計(jì)時(shí)秒數(shù)轉(zhuǎn)時(shí)分秒然后倒計(jì)時(shí)功能
有一個(gè)需求,需要在頁(yè)面進(jìn)行顯示倒計(jì)時(shí),倒計(jì)時(shí)結(jié)束后,做相應(yīng)的邏輯處理,這篇文章主要介紹了Flutter實(shí)現(xiàn)倒計(jì)時(shí)功能,秒數(shù)轉(zhuǎn)時(shí)分秒,然后倒計(jì)時(shí),需要的朋友可以參考下2023-08-08
Android registerForActivityResult動(dòng)態(tài)申請(qǐng)權(quán)限案例詳解
這篇文章主要介紹了Android registerForActivityResult動(dòng)態(tài)申請(qǐng)權(quán)限案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09
Android Okhttp請(qǐng)求查詢購(gòu)物車的實(shí)例代碼
下面小編就為大家分享一篇Android Okhttp請(qǐng)求查詢購(gòu)物車的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01
Android控件BottomSheet實(shí)現(xiàn)底邊彈出選擇列表
這篇文章主要介紹了Android控件BottomSheet實(shí)現(xiàn)底邊彈出選擇列表,比較常用的選擇條件或跳轉(zhuǎn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
Android判斷touch事件點(diǎn)是否在view范圍內(nèi)的方法
這篇文章主要介紹了Android判斷touch事件點(diǎn)是否在view范圍內(nèi)的方法,涉及Android事件響應(yīng)與view屬性操作的相關(guān)技巧,需要的朋友可以參考下2016-03-03
Android實(shí)現(xiàn)判斷某個(gè)服務(wù)是否正在運(yùn)行的方法
這篇文章主要介紹了Android實(shí)現(xiàn)判斷某個(gè)服務(wù)是否正在運(yùn)行的方法,涉及Android針對(duì)系統(tǒng)服務(wù)運(yùn)行狀態(tài)的判斷技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10

