動(dòng)畫分三種:View動(dòng)畫呢蔫,幀動(dòng)畫牲览,屬性動(dòng)畫崭捍。
View 動(dòng)畫
概述:
一般只能修改組件(View Object)的部分屬性,比如:scaling(大小)和rotation(旋轉(zhuǎn))眼五,但是無(wú)法修改組件的背景顏色,支持簡(jiǎn)單的縮放、平移泞遗、旋轉(zhuǎn)、透明度基本的動(dòng)畫席覆,且有一定的局限性史辙,但是當(dāng)View Animation能方便快速地解決需求時(shí),選擇它也是不錯(cuò)的選擇佩伤。
View Animation使某個(gè)組件產(chǎn)生動(dòng)畫效果移動(dòng)一段距離后聊倔,比如從屏幕左側(cè)移動(dòng)到右側(cè),其實(shí)整個(gè)過(guò)程是繪制出來(lái)的效果生巡,該組件真正的位置依然保留在左側(cè)耙蔑,只有點(diǎn)擊左側(cè)位置才能觸發(fā)該組件。所以想真正移動(dòng)某組件孤荣,需要在動(dòng)畫結(jié)束后添加代碼實(shí)現(xiàn)甸陌。
View動(dòng)畫的描述文件具有固定語(yǔ)法
梳理一下View動(dòng)畫的知識(shí)點(diǎn):
作用對(duì)象:View
共四種動(dòng)畫效果:平移動(dòng)畫,縮放動(dòng)畫垃环,旋轉(zhuǎn)動(dòng)畫邀层,透明度動(dòng)畫
幀動(dòng)畫 屬于 View動(dòng)畫,但是表現(xiàn)形式不同
建議采用XML定義遂庄,可讀性更好(也可以代碼動(dòng)態(tài)創(chuàng)建)
View動(dòng)畫的四種變換:
名稱 | 標(biāo)簽 | 子類 | 效果 |
---|---|---|---|
平移動(dòng)畫 | <translate/> | TranslateAnimation | 移動(dòng)View |
縮放動(dòng)畫 | <scale/> | ScaleAnimation | 放大或縮小View |
旋轉(zhuǎn)動(dòng)畫 | <rotate/> | RotateAnimation | 旋轉(zhuǎn)View |
透明度動(dòng)畫 | <alpha/> | AlphaAnimation | 改變View的透明度 |
使用案例(為方便就直接添加備注了):
<!--float表示填入float值-->
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="[package:]anim/interpolator_resource"
android:shareInterpolator="false"
android:duration="float" <!--動(dòng)畫持續(xù)時(shí)間-->
android:fillAfter="true"> <!--動(dòng)畫結(jié)束后View是否停留在結(jié)束位置茬斧,true -> 挺留-->
<alpha
android:fromAlpha="float" <!--透明度的起始值,例如0.1-->
android:toAlpha="float"/> <!--透明度的結(jié)束值矩肩,比如1-->
<scale
android:fromXScale="float" <!--水平方向縮放的起始值,例如0.1-->
android:toXScale="float" <!--水平方向縮放的結(jié)束值凛澎,例如0.5-->
android:fromYScale="float" <!--豎直方向縮放的起始值-->
android:toYScale="float" <!--豎直方向縮放的結(jié)束值-->
android:pivotX="float" <!--縮放的軸點(diǎn)的x坐標(biāo),默認(rèn)為View的中心-->
android:pivotY="float"/> <!--縮放的軸點(diǎn)的y坐標(biāo)-->
<translate
android:fromXDelta="float" <!--x起始值估蹄,例如0-->
android:toXDelta="float" <!--x的結(jié)束值塑煎,例如10-->
android:fromYDelta="float" <!--y的起始值-->
android:toYDelta="float"/> <!--y的結(jié)束值-->
<rotate
android:fromDegrees="float" <!--旋轉(zhuǎn)開(kāi)始的角度,例如0-->
android:toDegrees="float" <!--旋轉(zhuǎn)結(jié)束的角度臭蚁,例如180-->
android:pivotY="float" <!--旋轉(zhuǎn)軸點(diǎn)的x坐標(biāo)-->
android:pivotX="float"/> <!--旋轉(zhuǎn)軸點(diǎn)的y坐標(biāo)-->
</set>
android:interpolator:
插值器最铁,影響動(dòng)畫的速度,默認(rèn)為:@android:anim/accelerate_decelerate_interpolater(加速減速插值器)
android:shareInterpolator:
表示集合中的動(dòng)畫是否和集合共享同一個(gè)插值器垮兑。不指定插值器冷尉,則子動(dòng)畫就需要單獨(dú)指定所需的插值器或使用默認(rèn)值
加入動(dòng)畫及監(jiān)聽(tīng)
啟動(dòng)動(dòng)畫:
Animation anim = AnimationUtils.loadAnimation(this, R.anim.my_animation);
button.startAnimation(animation);
監(jiān)聽(tīng):
能進(jìn)行動(dòng)畫啟動(dòng),結(jié)束系枪,重復(fù)的監(jiān)聽(tīng)
anim.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
//這里就是動(dòng)畫結(jié)束
}
});
自定義動(dòng)畫
上面是系統(tǒng)提供的四種動(dòng)畫雀哨,當(dāng)然我們也可以自定義一些動(dòng)畫,它只需要繼承Animation這個(gè)抽象類私爷,重寫initialize和applyTransformation方法雾棺。applyTransformation方法里面進(jìn)行相應(yīng)的矩陣變換。實(shí)際情況里面衬浑,很少使用這個(gè)捌浩,就不予講解。
幀動(dòng)畫(View動(dòng)畫的特殊形式)
幀動(dòng)畫是順序播放一組先定義好的圖片嚎卫,系統(tǒng)提供AnimationDrawable類完成工作嘉栓。
下面來(lái)介紹一些基本用法:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/gpf" android:duration="50"/>
<item android:drawable="@drawable/gpg" android:duration="50"/>
<item android:drawable="@drawable/gph" android:duration="50"/>
</animation-list>
添加動(dòng)畫:
View loadingView = (View) findViewById(R.id.loading);
loadingView.setBackgroundResource(R.drawable.drawable_anim);
AnimationDrawable drawable = (AnimationDrawable) loadingView.getBackground();
drawable.start();
這里有一個(gè)坑,就是這個(gè)動(dòng)畫只能只能在drawable下新建文件添加動(dòng)畫拓诸,圖片只能引用drawable里面的侵佃,它的英文名字就叫Drawable Animation嘛。從調(diào)用里面你應(yīng)該也猜到原理了吧奠支,其實(shí)就是一幀一幀的更換背景馋辈。但是幀動(dòng)畫容易引起 OOM,所以應(yīng)盡量避免使用過(guò)多尺寸較大的圖片倍谜。筆者在寫的時(shí)候做了一個(gè)加載中的demo迈螟,很easy,試試吧尔崔。
View 動(dòng)畫的經(jīng)典使用姿勢(shì)
LayoutAnimation 改變你的ViewGroup
LayoutAnimation(布局動(dòng)畫)是為ViewGroup指定一個(gè)動(dòng)畫答毫。它可以為子View添加出場(chǎng)動(dòng)畫。最常見(jiàn)的就是ListView的item進(jìn)場(chǎng)動(dòng)畫就是這個(gè)類完成的季春。
初學(xué)姿勢(shì):
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="0.5"
android:animationOrder="normal"
android:animation="@anim/viewadd"> <!-- 指定具體的入場(chǎng)動(dòng)畫-->
</layoutAnimation>
添加動(dòng)畫:
-
在布局xml里面
<ListView ... android:layoutAnimation=“@anim/lsit_layout_anim” />
代碼添加
android:delay:動(dòng)畫延遲洗搂。
android:animationOrder:子動(dòng)畫的順序。共normal,reverse耘拇,random三種撵颊。
normal -> 順序顯示,及排在前面的先顯示惫叛。
reverse -> 逆向顯示
random -> 隨機(jī)顯示
轉(zhuǎn)場(chǎng)動(dòng)畫(Activity跳轉(zhuǎn))
為Activity和Fragment添加動(dòng)畫的方式很多倡勇,但是大多都有兼容問(wèn)題,這是學(xué)習(xí)時(shí)的一個(gè)坑嘉涌,可以注意一下妻熊。例如Fragment和屬性動(dòng)畫都是API11的時(shí)候引入的,而這時(shí)候我們需要使用v4這個(gè)兼容包洛心,那切換動(dòng)畫就只能使用FragmentTransaction 里面的setCustomAnimation() 來(lái)切換固耘,但是這個(gè)方法只能使用View動(dòng)畫。
每個(gè)Activity都有默認(rèn)的跳轉(zhuǎn)動(dòng)畫词身,而這個(gè)動(dòng)畫當(dāng)然我們也可以自定義。主要就是使用 overridePeddlingTransition(int enterAnim, int extAnim)方法番枚,當(dāng)然法严,這個(gè)方法是在startActivity(Intent)和finish()方法之后被調(diào)用
overridePeddlingTransition(int enterAnim, int extAnim):參數(shù)就是兩個(gè)動(dòng)畫的資源id
啟動(dòng)姿勢(shì):
startActivity(new Intent(this, SecondActivity.class));
overridePeddlingTransition(R.anim.enter_anim, R.anim.ext_anim);
結(jié)束姿勢(shì):
@Override
public void finish(){
super.finish();
overridePeddlingTransition(R.anim.enter_anim, R.anim.ext_anim);
}
別人家的動(dòng)畫:
屬性動(dòng)畫
屬性動(dòng)畫講解第一部分見(jiàn) Android屬性動(dòng)畫(Property Animation)
插值器和估值器
TimeInterpolator,時(shí)間插值器葫笼,作用就是根據(jù)時(shí)間流逝的百分比來(lái)計(jì)算出當(dāng)前屬性值改變的百分比深啤。(得到百分比)
LinearInterpolator,線性插值器:勻速動(dòng)畫
AccelerateDecelerateInterpolator路星,加速減速插值器:兩頭慢中間快
DecelerateInterpolator溯街,減速插值器:動(dòng)畫越來(lái)越慢
TypeEvaluator,類型估值器洋丐,根據(jù)當(dāng)前屬性改變的百分比來(lái)計(jì)算改變后的屬性值(得到具體屬性值)
InteEvaluator呈昔,針對(duì)整形屬性
FloateEvaluator,針對(duì)浮點(diǎn)屬性
ArgbeEvaluator友绝,針對(duì)Color屬性
屬性動(dòng)畫監(jiān)聽(tīng)
AnimatorListener 上文使用過(guò)就不再贅述
AnimatorListenerAdapter 類堤尾,他是AnimatorListener 的適配器類,所以就可以有選擇的實(shí)現(xiàn)AnimatorListener 的方法
-
AnimatorUpdateListener 接口迁客,每播放一幀就被調(diào)用一次
public static interface AnimatorUpdateListener { void onAnimationUpdate(ValueAnimator animation); }