Animation 分類說明
前面分析了Animation基類,然后簡單概述了動畫原理,Animation動畫概述
Animation可以利用類和XML文件兩種方式生成動畫:
下面講解如何使用Animation的子類谱姓,包括:
- translate (平移動畫) --- TranslateAnimation
- scale (縮放動畫) --- ScaleAnimation
- rotate (旋轉(zhuǎn)動畫) --- RotateAnimation類
- alpha ( 透明度動畫) --- AlphaAnimation 類
使用xml動畫文件方式泊藕,利用 AnimationUtils loadAnimation()加載xml文件,可以解析生成對應(yīng)動畫召嘶。
更多請參閱官方文檔https://developer.android.google.cn/reference/android/view/animation/Animation
1 TranslateAnimation 平移動畫
構(gòu)造函數(shù):
//從資源文件加載
TranslateAnimation(Context context, AttributeSet attrs)
TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue)
參數(shù)說明:
參數(shù)說明
fromXDelta:移動的起始點(diǎn)X軸坐標(biāo)蜻懦,可以是具體數(shù)值间螟、百分?jǐn)?shù)夸溶、百分?jǐn)?shù)+p 三種樣式逸吵,比如 10、10%缝裁、10%p
fromYDelta:移動的 起始點(diǎn)Y軸從標(biāo)扫皱,可以是數(shù)值、百分?jǐn)?shù)捷绑、百分?jǐn)?shù)p 三種樣式韩脑;
toXDelta : 移動的結(jié)束點(diǎn)X軸坐標(biāo)
toYDelta : 移動的結(jié)束點(diǎn)Y軸坐標(biāo)
**fromXType : ** fromXValue的坐標(biāo)類型
fromXValue: X軸方向移動的初始坐標(biāo)
toXType: toXValue的坐標(biāo)類型
toXValue X軸方向結(jié)束的坐標(biāo)
fromYType: fromYValue的坐標(biāo)類型
fromYValue: Y軸方向移動的起始點(diǎn)坐標(biāo)
toYType: toYValue的坐標(biāo)類型
toYValue: Y軸方向結(jié)束的坐標(biāo)
坐標(biāo)類型Type的種類:
ABSOLUTE,RELATIVE_TO_SELF粹污,RELATIVE_TO_PARENT第一個代表具體值段多,第二個相對于view自己,第三個相對于父布局壮吩。
重要:所有坐標(biāo)類似(fromXdelta进苍,toXDelta,fromYDelta,ToYDelta)的值都是相對于View的左上角,所以動畫坐標(biāo)的原點(diǎn)都是View自己的左上角鸭叙。view的左上角為動畫進(jìn)行的坐標(biāo)原點(diǎn)(0,0)
第一個構(gòu)造函數(shù)和第二個構(gòu)造函數(shù)的結(jié)構(gòu)不同觉啊,且第一個構(gòu)造函數(shù)沒有坐標(biāo)類型,但是它的數(shù)值可以分成三類可以是具體數(shù)值沈贝、百分?jǐn)?shù)杠人、百分?jǐn)?shù)+p 三種樣式這三類就分別對應(yīng)了ABSOLUTE,RELATIVE_TO_SELF宋下,RELATIVE_TO_PARENT嗡善。
第一個構(gòu)造函數(shù)中的屬性可以用到xml動畫文件中, 第二個則側(cè)重代碼生成平移動畫杨凑。
XML實現(xiàn)移動動畫
具體值:
一個大小為400,200的view移動400,200的距離滤奈,之后保存動畫后的狀態(tài),為了標(biāo)識view移動了會在view的底部繪制一個大小位置一樣的粉色view作為參照撩满。
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="400"
android:fromYDelta="0"
android:toYDelta="200"
android:duration="3000"
android:fillAfter="true">
</translate>
兩個400*200的TextView相互覆蓋,然后移動頂部的TextView移動(400,200)的距離绅你。fillAfter為true表示動畫結(jié)束時保持動畫最終的效果伺帘。
如果利用百分?jǐn)?shù)如何實現(xiàn)上面相同的代碼,百分?jǐn)?shù)是相對于自身大小忌锯,所以直接使用100%即可
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="100%"
android:fromYDelta="0"
android:toYDelta="100%"
android:duration="3000"
android:fillAfter="true">
</translate>
100%相當(dāng)于view的寬和高的100%伪嫁。
可以看到結(jié)果相同。
利用百分?jǐn)?shù)+p實現(xiàn)從頂部移動parent寬高的一半距離偶垮。
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="50%p"
android:fromYDelta="0"
android:toYDelta="50%p"
android:duration="3000"
android:fillAfter="true">
</translate>
結(jié)果圖张咳,紅色框是截圖是畫上的帝洪,為了標(biāo)識移動了整個父view的寬高的一半。
如果設(shè)置fromXDelta和fromYDelta為負(fù)呢脚猾?
由于動畫坐標(biāo)原點(diǎn)都是view的左上角葱峡,所以如果為負(fù),動畫開始時會出現(xiàn)在view的左上方龙助。
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="-100%"
android:toXDelta="50%p"
android:fromYDelta="-100%"
android:toYDelta="50%p"
android:duration="3000"
android:fillAfter="true">
</translate>
代碼方式實現(xiàn)砰奕,簡單例子
TranslateAnimation translateAnimation = new TranslateAnimation(0, 400, 0, 200);
translateAnimation.setDuration(3000);
translateAnimation.setFillAfter(true);
mTVDemo.startAnimation(translateAnimation);
2 AlphaAnimation 透明度動畫
構(gòu)造函數(shù)
AlphaAnimation(Context context, AttributeSet attrs):讀取xml文件生成
AlphaAnimation(float fromAlpha, float toAlpha):
參數(shù)說明:
fromAlpha:開始的透明度,toAlpha:結(jié)束時的透明度
取值: 1.0f代表不透明 提鸟, 0.0f表示全透明
xml實現(xiàn)
實現(xiàn)view從透明度0.1军援,變化到1.0.
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="0.1"
android:toAlpha="1.0"
android:duration="3000"
android:fillBefore="true">
</alpha>
代碼實現(xiàn)
AlphaAnimation alphaAnimation = new AlphaAnimation(0.1f, 1.0f);
alphaAnimation.setDuration(3000);
alphaAnimation.setFillBefore(true);
mTVDemo.startAnimation(alphaAnimation);
3 ScaleAnimation 縮放動畫
構(gòu)造函數(shù):
ScaleAnimation(Context context, AttributeSet attrs):利用xml文件生成對象
ScaleAnimation(float fromX, float toX, float fromY, float toY)
ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY)
ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
參數(shù)說明
fromXScale X軸方向上動畫開始時相對自身的縮放比例,取值float称勋,1.0表示沒有縮放胸哥,大于1.0表示放大,小于1.0表示縮小
toXScale X軸方向上動畫結(jié)束時相對自身的縮放比例赡鲜;
fromYScale Y軸方向上動畫開始時相對自身的縮放比例空厌,
toYScale X軸方向上動畫結(jié)束時相對自身的縮放比例;
pivotX X軸方向上相對于原點(diǎn)(view左上角)的移動坐標(biāo)蝗蛙,移動后作為新的縮放原點(diǎn)蝇庭,可以是數(shù)值、百分?jǐn)?shù)捡硅、百分?jǐn)?shù)p 三種樣式哮内。
pivotY Y軸方向上相對于原點(diǎn)的移動坐標(biāo),意義和android:pivotX一樣壮韭。
pivotXType 坐標(biāo)類型北发,類似TranslateAnimation的坐標(biāo)類型,主要用于代碼生成animation時喷屋,指定坐標(biāo)類型
pivotYType 坐標(biāo)類型琳拨,類似TranslateAnimation的坐標(biāo)類型,主要用于代碼生成animation時屯曹,指定坐標(biāo)類型
變換的坐標(biāo)原點(diǎn)依然是view的左上角
XML方式實現(xiàn)動畫
從坐標(biāo)原點(diǎn)(view左上角)狱庇,view由0,放大兩倍恶耽。
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXScale="0.0"
android:toXScale="2.0"
android:fromYScale="0.0"
android:toYScale="2.0"
android:pivotX="0"
android:pivotY="0"
android:duration="3000"
android:fillAfter="true"/>
在以view左上角為坐標(biāo)原點(diǎn)從0經(jīng)歷3秒放大兩倍view密任。
修改坐標(biāo)原點(diǎn)為view的中心點(diǎn)
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXScale="0.0"
android:toXScale="2.0"
android:fromYScale="0.0"
android:toYScale="2.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="3000"
android:fillAfter="true"/>
利用百分比,移動到view的中心進(jìn)行縮放
利用百分?jǐn)?shù)+p偷俭,設(shè)置縮放原點(diǎn)
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXScale="0.0"
android:toXScale="2.0"
android:fromYScale="0.0"
android:toYScale="2.0"
android:pivotX="50%p"
android:pivotY="50%p"
android:duration="3000"
android:fillAfter="true"/>
利用百分?jǐn)?shù)+p 移動縮放點(diǎn)左右都移動父view的一半浪讳,然后進(jìn)行縮放。
類似投影方式涌萤,縮放原點(diǎn)和最終圖片的關(guān)系:
代碼實現(xiàn)
ScaleAnimation scaleAnimation = new ScaleAnimation(0.0f, 2.0f, 0.0f, 2.0f);
scaleAnimation.setDuration(3000);
scaleAnimation.setFillAfter(true);
mTVDemo.startAnimation(scaleAnimation);
4 RotateAnimation 旋轉(zhuǎn)動畫
構(gòu)造函數(shù)
RotateAnimation(Context context, AttributeSet attrs)
RotateAnimation(float fromDegrees, float toDegrees)
RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY)
RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
參數(shù)說明
- fromDegrees 開始旋轉(zhuǎn)的角度淹遵,正值順時針口猜,負(fù)值逆時針
- toDegrees 結(jié)束時旋轉(zhuǎn)到的角度,正值順時針透揣,負(fù)值逆時針
- pivotX 旋轉(zhuǎn)起點(diǎn)X軸坐標(biāo)济炎,可以是數(shù)值、百分?jǐn)?shù)淌实、百分?jǐn)?shù)p 和上面的類似規(guī)則一樣冻辩,左上角為坐標(biāo)原點(diǎn)。
- pivotY 旋轉(zhuǎn)起點(diǎn)Y軸坐標(biāo)拆祈,可以是數(shù)值恨闪、百分?jǐn)?shù)、百分?jǐn)?shù)p
- pivotXType,pivotYType 類似和其他動畫類含義類似放坏。
XML方式實現(xiàn):
實現(xiàn)view從0度順時針旋轉(zhuǎn)270度咙咽,坐標(biāo)原點(diǎn)為view左上角(0,0)
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:toDegrees="270"
android:pivotX="0"
android:pivotY="0"
android:duration="3000"
android:fillAfter="true">
</rotate>
利用百分?jǐn)?shù),修改坐標(biāo)原點(diǎn)為view的中心點(diǎn)
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:toDegrees="270"
android:pivotX="50%"
android:pivotY="50%"
android:duration="3000"
android:fillAfter="true">
</rotate>
繞中心旋轉(zhuǎn)
代碼實現(xiàn):
RotateAnimation rotateAnimation = new RotateAnimation(0.0f, 270f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rotateAnimation.setDuration(3000);
rotateAnimation.setFillAfter(true);
mTVDemo.startAnimation(rotateAnimation);
5 AnimationSet 聯(lián)合動畫
animationSet繼承自Animation沒有自己的屬性完全繼承父類淤年,但是有些屬性對它無效钧敞,屬性說明:
- duration, repeatMode, fillBefore, fillAfter: 這些屬性設(shè)置給了AnimationSet會作用于它內(nèi)部的Animation對象.
- repeatCount, fillEnabled: 這些屬性對AnimationSet無效,將被忽略.
- startOffset, shareInterpolator: 這些屬性只作用于AnimationSet.
構(gòu)造函數(shù)
AnimationSet(Context context, AttributeSet attrs)
AnimationSet(boolean shareInterpolator) shareInterpolator取值為true時麸粮,指在AnimationSet中定義一個插值器(interpolater)溉苛,它下面的所有動畫共同使用,為false弄诲,則各自定義插值器愚战。
常用方法:添加動畫:
public void addAnimation (Animation a)
XML方式實現(xiàn)動畫
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"
android:fillAfter="true">
<translate
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="100"
android:toYDelta="100" />
<alpha
android:fromAlpha="0.5"
android:toAlpha="1.0" />
<scale
android:fromXScale="0.0"
android:fromYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="2.0"
android:toYScale="2.0" />
<rotate
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="-270" />
</set>
代碼實現(xiàn)
AnimationSet animationSet = new AnimationSet(true);
animationSet.addAnimation(alphaAnimation);
animationSet.addAnimation(scaleAnimation);
animationSet.addAnimation(rotateAnimation);
mTVDemo.startAnimation(animationSet);
Animation動畫概述和執(zhí)行原理
Android動畫之補(bǔ)間動畫TweenAnimation
Android動畫之逐幀動畫FrameAnimation
Android動畫之插值器簡介和系統(tǒng)默認(rèn)插值器
Android動畫之插值器Interpolator自定義
Android動畫之視圖動畫的缺點(diǎn)和屬性動畫的引入
Android動畫之ValueAnimator用法和自定義估值器
Android動畫之ObjectAnimator實現(xiàn)補(bǔ)間動畫和ObjectAnimator自定義屬性
Android動畫之ObjectAnimator中ofXX函數(shù)全解析-自定義Property,TypeConverter齐遵,TypeEvaluator
Android動畫之AnimatorSet聯(lián)合動畫用法
Android動畫之LayoutTransition布局動畫
Android動畫之共享元素動畫
Android動畫之ViewPropertyAnimator(專用于view的屬性動畫)
Android動畫之Activity切換動畫overridePendingTransition實現(xiàn)和Theme Xml方式實現(xiàn)
Android動畫之ActivityOptionsCompat概述
Android動畫之場景變換Transition動畫的使用
Android動畫之Transition和TransitionManager使用
Android動畫之圓形揭露動畫Circular Reveal
Android 動畫之 LayoutAnimation 動畫
Android動畫之視圖動畫的缺點(diǎn)和屬性動畫的引入