前言
國內的Android大部分應用不重視頁面的簡潔,而且業務邏輯是越攢越多,最終成為一個龐然大物,這個趨勢必然不會在意界面的炫酷,但是今天我淺記一下炫酷之動畫,Android自3.0以前只有逐幀動畫和補間動畫,在3.0以后新增了ObjectAnimator(屬性動畫),在5.0以后又新增了一系列好看的MD風格動畫,當然期間不缺乏一些好用的非官方動畫框架譬如nineoldandroids,但是由于接下來的出場率不高暫且不談,接下來我們當簡談下列舉的動畫,在開談前還得鄭重的提醒句,代碼中動態創建的動畫一定要注意退出,否則動畫所造成的內存泄漏比Bitmap還can忍,它貌似會持續增高。
工具:AS 2.3.1 編譯版本:api 25 構建版本:gradle2.3.1
- 逐幀動畫(Frame Animation)
- 補間動畫(Tween Animation)
- 屬性動畫(Property Animation ) 3.0后新增
- MateriaDesign
1.Touch feedback(觸摸反饋)
2.Reveal effect(揭露效果)
3.Activity transitions(轉場動畫實在有很多,最出名的莫屬共享元素)
4.Curved motion(曲線運動)
5.View state changes (視圖狀態改變)
6.Animate Vector Drawables(可繪矢量動畫) - Lottie(多端支持的未來方向動畫)
逐幀動畫(Frame Animation)
逐幀動畫其實學過Flash的同學絕對不陌生,我們對每一幀設置一個動作,然后連貫的播放起來,這里在Android也是可以這么理解的,做法很簡單,平時我們只需要找美工要一個動作的幾張分解圖,然后XXX就好了,下面來一發例子。
首先呢我們就先找一些圖片這種東西不是稀缺貨,就像下面這個,共有12張。
代碼怎么寫呢?
第一步:我們在xml靜態文件中配置這些東西,下面的注釋很重要、很重要、很重要我說三遍。
<?xml version="1.0" encoding="utf-8"?>
<animation-list android:oneshot="false"
xmlns:android="http://schemas.android.com/apk/res/android">
<!--
說明:android:oneshot="false"此屬性為false則表示此逐幀動畫將會循環執行,一般我們使用為循環執行。
注:經實際操作發現:
1.此處item無法引用mipmap文件夾下的圖片,動畫圖片只能放置在drawable下面。
2.此文件只可放置在drawable文件夾下,anim文件夾下無animation-list標簽會報錯,百度上有人說可隨意放置在anim或者drawable文件夾下,
或許是工具版本有差異,反正官方放置在drawable文件夾下,而我們現在別無選擇。-->
<item android:drawable="@drawable/ic_loading_white_01" android:duration="100" />
<item android:drawable="@drawable/ic_loading_white_02" android:duration="100" />
<item android:drawable="@drawable/ic_loading_white_03" android:duration="100" />
<item android:drawable="@drawable/ic_loading_white_04" android:duration="100" />
<item android:drawable="@drawable/ic_loading_white_05" android:duration="100" />
<item android:drawable="@drawable/ic_loading_white_06" android:duration="100" />
<item android:drawable="@drawable/ic_loading_white_07" android:duration="100" />
<item android:drawable="@drawable/ic_loading_white_08" android:duration="100" />
<item android:drawable="@drawable/ic_loading_white_09" android:duration="100" />
<item android:drawable="@drawable/ic_loading_white_10" android:duration="100" />
<item android:drawable="@drawable/ic_loading_white_11" android:duration="100" />
<item android:drawable="@drawable/ic_loading_white_12" android:duration="100" />
</animation-list>
第二步:既然是動畫就需要動那就那啥。。。需要播放出來,我實際操作在onCreate周期方法中
ImageView imgView = (ImageView) findViewById(R.id.img);
AnimationDrawable animDrawable = (AnimationDrawable) getResources().getDrawable(R.drawable.frame_animation);
animDrawable.setOneShot(false);
imgView.setBackground(animDrawable);
animDrawable.start();
這里需要注意的就是有博客說此處可能會遇到一個bug,就是控件只顯示第一幀,據說是Window對象未初始化完成,無法添加動畫載體控件的對象所致,這我無法辨別真假,暫且相信為一個低概率事件,出現時就把我上面操作動畫的代碼放到onWindowFocusChanged系統方法里面吧,反正我是遇到只顯示第一幀,不過只是因為沒有animDrawable.start();這里還得鄙視一下那些沒有在onDestroy或者在onPuse等周期方法中銷毀動畫的人,始亂終棄,動畫所造成的內存泄漏是你承擔不起的,不起的,起的,嘀嘀嘀嘀嘀嘀嘀。
if(animDrawable.isRunning()){
animDrawable.stop();
}
水波紋(觸摸反饋)
參考例子別忘了這個http://blog.csdn.net/u012209506/article/details/72833936
共享元素動畫 http://blog.sina.com.cn/s/blog_7452896e0102vdko.html(可做參考寫)
共享元素這個東西真的很炫酷,這里不做詳細探究,只記用法
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(MailDetailsActivity.this, view, "look");
startActivity(intent,options.toBundle());
目標控件加上android:transitionName="look"
即可完成轉場動畫
2者不可缺一
未完,待補充...