動(dòng)畫(huà)分類(lèi):
view動(dòng)畫(huà)(平移携悯,旋轉(zhuǎn)开呐,縮放,透明度):xml和代碼均可實(shí)現(xiàn)搜骡,建議用xml,因?yàn)閤ml 可讀性高點(diǎn)
幀動(dòng)畫(huà): 算view動(dòng)畫(huà)的一種,是由一組圖片依次切換達(dá)到動(dòng)畫(huà)的效果佑女,圖片太多時(shí)记靡,容易o(hù)om
屬性動(dòng)畫(huà):改變動(dòng)畫(huà)屬性來(lái)完成動(dòng)畫(huà),api11之后才有团驱,可用兼容包在低版本實(shí)現(xiàn)摸吠;
插值器:
經(jīng)常看到interpolator這個(gè)屬性嚎花,表示動(dòng)畫(huà)集合所采用的插值器寸痢,插值器影響的是動(dòng)畫(huà)的速度,比如非勻速動(dòng)畫(huà)需要通過(guò)interpolator來(lái)控制動(dòng)畫(huà)的播放速度紊选。這個(gè)屬性可不指定直接用默認(rèn)的---加速減速插值器啼止。
shareInterpolator屬性表示集合中的動(dòng)畫(huà)是否和集合共享同一個(gè)插值器道逗。
自定義View動(dòng)畫(huà)(實(shí)際開(kāi)發(fā)中很少用到。一般會(huì)借助Camera類(lèi))
view動(dòng)畫(huà)可以直接在xml上指定献烦,可以是一種類(lèi)型動(dòng)畫(huà)滓窍,也可以是多種類(lèi)型的動(dòng)畫(huà)集合,除了系統(tǒng)提供的四種View動(dòng)畫(huà)巩那,我們也可以自定義View動(dòng)畫(huà)吏夯;
自定義View動(dòng)畫(huà)只需要集成Animation這個(gè)抽象類(lèi),重寫(xiě)initialize和applyTransformation兩個(gè)方法即横,initialize中做一些初始化工作噪生,applyTransformation中進(jìn)行相應(yīng)的矩陣變換即可。(矩陣方面是數(shù)學(xué)上的概念东囚,太過(guò)復(fù)雜的矩陣變換會(huì)算起來(lái)難)
幀動(dòng)畫(huà)
幀動(dòng)畫(huà)使用簡(jiǎn)單跺嗽,但是容易引起oom,所以在使用幀動(dòng)畫(huà)的時(shí)候贏盡量避免使用過(guò)多尺寸較大的圖片舔庶。
LayoutAnimation
作用于ViewGroup抛蚁,這樣它的子元素出場(chǎng)時(shí)都會(huì)具有這樣的動(dòng)畫(huà)效果。如listView中每個(gè)item都要以一定的動(dòng)畫(huà)的形式出現(xiàn)惕橙,使用的就是layoutAnimation.
兩個(gè)Activity切換用的overridePendingTransition必須位于startActivity/finish的后面瞧甩,否則不起作用。
屬性動(dòng)畫(huà)
分為:ValueAnimator.objectAnimator,AnimatorSet弥鹦;在一個(gè)時(shí)間間隔內(nèi)完成對(duì)象從一個(gè)屬性值到另一個(gè)屬性值的改變肚逸;
TimeInterpolator---時(shí)間插值器,根據(jù)時(shí)間流逝的百分比計(jì)算當(dāng)前屬性值改變的百分比彬坏,
TypeEvaluator---估值器朦促,根據(jù)當(dāng)前的屬性改變的百分比算出經(jīng)過(guò)改變后當(dāng)前的屬性值。
在更改View屬性時(shí)栓始,發(fā)現(xiàn)很多屬性并不能直接set务冕,因?yàn)闆](méi)有提供接口,這時(shí)候官方文檔有解決方法:用一個(gè)類(lèi)來(lái)包裝原始對(duì)象幻赚,間接為其提供get和set 方法
例如設(shè)置Button的寬度:
private void performAnimate() {?
ViewWrapper wrapper = new ViewWrapper(mButton);
ObjectAnimator.ofInt(wrapper, "width", 500).setDuration(5000).start();
}
@Override
onClick(View v) {if (v == mButton) { performAnimate();}}
private static class ViewWrapper {
private View mTarget;
public ViewWrapper(View target){mTarget = target;}
public int getWidth(){return mTarget.getLayoutParams().width}
public void setWidth(int width) {mTarget.getLayoutParams().width = width; mTarget.requestLayout();}
使用動(dòng)畫(huà)的注意點(diǎn):
1.oom禀忆, 幀動(dòng)畫(huà)
2.內(nèi)存泄漏:屬性動(dòng)畫(huà)有一類(lèi)無(wú)限循環(huán)的動(dòng)畫(huà),在Activity退出時(shí)及時(shí)停止
3.View動(dòng)畫(huà)是對(duì)View的影像做動(dòng)畫(huà)落恼,并不是真正的改變View的狀態(tài)箩退,因此有時(shí)候會(huì)出現(xiàn)動(dòng)畫(huà)完成后VIew無(wú)法隱藏的問(wèn)題,即setVisibility(GOnd)不管用佳谦,這個(gè)時(shí)候要clearAnimation清除View動(dòng)畫(huà)即可解決此問(wèn)題
4.不要使用px. 因?yàn)楦鱾€(gè)設(shè)備px會(huì)有不同的效果