Android LayoutAnimation使用及扩展
文章來(lái)源
在Android中,最簡(jiǎn)單的動(dòng)畫(huà)就是補(bǔ)間動(dòng)畫(huà)了。通過(guò)補(bǔ)間動(dòng)畫(huà),可以對(duì)一個(gè)控件進(jìn)行位移、縮放、旋轉(zhuǎn)、改變透明度等動(dòng)畫(huà)。但是補(bǔ)間動(dòng)畫(huà)只能對(duì)一個(gè)控件使用,如果要對(duì)某一組控件播放一樣的動(dòng)畫(huà)的話,可以考慮layout-animation。
LayoutAnimation
layout-animation可由xml和代碼兩種方式配置:
XML配置
由于layout-animation是對(duì)于某一組控件的操作,就需要一個(gè)基本的動(dòng)畫(huà)來(lái)定義單個(gè)控件的動(dòng)畫(huà)。另外還可以定義動(dòng)畫(huà)的顯示順序和延遲:
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"android:delay="30%"android:animationOrder="reverse"android:animation="@anim/slide_right" />其中
android:delay表示動(dòng)畫(huà)播放的延時(shí),既可以是百分比,也可以是float小數(shù)。
android:animationOrder表示動(dòng)畫(huà)的播放順序,有三個(gè)取值normal(順序)、reverse(反序)、random(隨機(jī))。
android:animation指向了子控件所要播放的動(dòng)畫(huà)。
上述步驟完成之后,就可以將layout-animation應(yīng)用到ViewGroup中,xml布局添加下面一行就ok:
這樣在加載布局的時(shí)候就會(huì)自動(dòng)播放layout-animtion。
代碼配置
如果在xml中文件已經(jīng)寫(xiě)好LayoutAnimation,可以使用AnimationUtils直接加載:
另外還可以手動(dòng)java代碼編寫(xiě),如:
//通過(guò)加載XML動(dòng)畫(huà)設(shè)置文件來(lái)創(chuàng)建一個(gè)Animation對(duì)象;Animation animation=AnimationUtils.loadAnimation(this, R.anim.slide_right);//得到一個(gè)LayoutAnimationController對(duì)象;LayoutAnimationController controller = new LayoutAnimationController(animation);//設(shè)置控件顯示的順序;controller.setOrder(LayoutAnimationController.ORDER_REVERSE);//設(shè)置控件顯示間隔時(shí)間;controller.setDelay(0.3);//為L(zhǎng)istView設(shè)置LayoutAnimationController屬性;listView.setLayoutAnimation(controller);listView.startLayoutAnimation();通過(guò)代碼設(shè)置可以達(dá)到同樣效果。
擴(kuò)展
前幾天遇到一個(gè)需求,將動(dòng)畫(huà)順序改為左上到右下角展開(kāi),例如Material Design中這個(gè)樣子。雖然一個(gè)個(gè)按順序播放頁(yè)可以實(shí)現(xiàn),但也太low了,就希望能夠找一個(gè)簡(jiǎn)便的方法。(PS. 個(gè)人崇尚簡(jiǎn)約就是美)
仔細(xì)觀察,很明顯就是一個(gè)LayoutAnimation,但是LayoutAnimation默認(rèn)只有三種順序,即順序逆序和隨機(jī),不能滿足需求。去翻翻源碼看它是怎么實(shí)現(xiàn)的,有沒(méi)有提供方法自定義順序?結(jié)果翻到了一個(gè)LayoutAnimationController#getTransformedIndex(AnimationParameters params)方法,返回值就是播放動(dòng)畫(huà)的順序。并且這個(gè)方法是protected的,明顯就是可由子類來(lái)擴(kuò)展。既然找到了方法,那么就去實(shí)現(xiàn)它:
/*** custom LayoutAnimationController for playing child animation* in any order.**/ public class CustomLayoutAnimationController extends LayoutAnimationController {// 7 just lucky number public static final int ORDER_CUSTOM = 7;private Callback onIndexListener;public void setOnIndexListener(OnIndexListener onIndexListener) {this.onIndexListener = onIndexListener; }public CustomLayoutAnimationController(Animation anim) {super(anim); }public CustomLayoutAnimationController(Animation anim, float delay) {super(anim, delay); }public CustomLayoutAnimationController(Context context, AttributeSet attrs) {super(context, attrs); }/*** override method for custom play child view animation order */ protected int getTransformedIndex(AnimationParameters params) {if(getOrder() == ORDER_CUSTOM && onIndexListener != null) {return onIndexListener.onIndex(this, params.count, params.index);} else {return super.getTransformedIndex(params);} }/*** callback for get play animation order**/ public static interface Callback{public int onIndex(CustomLayoutAnimationController controller, int count, int index); } }通過(guò)復(fù)寫(xiě)getTransformedIndex方法,添加自定義順序ORDER_CUSTOM,讓callback自定義控件播放動(dòng)畫(huà)的順序,即可以達(dá)到任何想要的效果。
總結(jié)
Android在設(shè)計(jì)的時(shí)候,提供了很好的擴(kuò)展性。各種組件都可以按需求擴(kuò)展。可能用的更多的是還是View.onDraw(Canvas canvas)方法,但不僅僅是view,對(duì)于其他組件,也可以隨意的擴(kuò)展。很多時(shí)候,并不一定需要自定義很多空間、功能之類的,往往擴(kuò)展一些簡(jiǎn)單的組件就能達(dá)到自己想要的結(jié)果。
總結(jié)
以上是生活随笔為你收集整理的Android LayoutAnimation使用及扩展的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 碎片Fragment
- 下一篇: Layout动画:在android布局发