Android中的動畫類型有兩種,一種是Tween動畫、還有一種是Frame動畫。Tween動畫,這種實現方式可以使視圖組件移動、放大、縮小以及產生透明度的變化;另一種Frame動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。下面將一一詳細介紹:
本博客參考自網絡,結合自己一點理解,實為學習之用,不為其他目的。
一,Tween動畫
又稱“補間動畫”、“中間動畫”,最早接觸Tween類是在學習Flash時候,使用ActionScript做動畫的時候,使用過類Tween。
Tween動畫主要的功能是在繪制動畫前設置動畫繪制的軌跡,包括時間, 位置 ,等等。但是Tween動畫的缺點是它只能設置起始點與結束點的兩幀,中間過程全部由系統幫我們完成。所以在幀數比較多的游戲開發中是不太會用到它的。
Tween一共提供了4中動畫的效果
Scale:縮放動畫
Rotate:旋轉動畫
Translate:移動動畫
Alpha::透明漸變動畫
Tween與Frame動畫類似都需要在res\anim路徑下創建動畫的 布局文件
1)Scale動畫
/anim/scalelitte.xml
/anim/scalebig.xml
如果在代碼中,加載動畫,而不用xml配置動畫
2)Rotate旋轉動畫
/anim/retateleft.xml
/anim/retateright.xml
3)Translate移動動畫
/layout/translate.xml
/anim/translate.xml
說明:
代碼中加載動畫:
4 )Alpha:透明漸變動畫
/anim/alpha.xml
說明:
手動加載動畫:
5)綜合動畫
可以將上面介紹的4種動畫設置在一起同時進行播放,那么就須要使用<set>標簽將所有須要播放的動畫放在一起。
這個動畫布局設置動畫同時播放移動、漸變、旋轉。
/anim/all.xml
二,AnimationDrable實現Frame動畫(設計游戲專用,嘎嘎嘎)感謝宣教主分享
/layout/simple.xml
看看內容應該是很好理解的,<animation-list>為動畫的總標簽,這里面放着幀動畫 <item>標簽,也就是說若干<item>標簽的幀 組合在一起就是幀動畫了。<animation-list > 標簽中android:oneshot="false" 這是一個非常重要的屬性,默認為false 表示 動畫循環播放, 如果這里寫true 則表示動畫只播發一次。 <item>標簽中記錄着每一幀的信息android:drawable="@drawable/a"表示這一幀用的圖片為"a",下面以此類推。 android:duration="100" 表示這一幀持續100毫秒,可以根據這個值來調節動畫播放的速度。
這是一個比較簡單的布局文件,應該都能看懂吧。 我主要說一下 最后的這個 ImageView, 它就是用來顯示我們的動畫。 這里使用android:background="@anim/animation"設置這個ImageView現實的背景為一個動畫,動畫資源的路徑為res/anim/animation.xml ,當然 設置background同樣也可以在代碼中設置。
- imageView.setBackgroundResource(R.anim.animation);
通過getBackground方法就可以拿到這個animationDrawable對象。
- /**拿到ImageView對象**/
- imageView = (ImageView)findViewById(R.id.imageView);
- /**通過ImageView對象拿到背景顯示的AnimationDrawable**/
- animationDrawable = (AnimationDrawable) imageView.getBackground();
AnimationDrawable 就是用來控制這個幀動畫,這個類中提供了很多方法。
animationDrawable.start(); 開始這個動畫
animationDrawable.stop(); 結束這個動畫
animationDrawable.setAlpha(100);設置動畫的透明度, 取值范圍(0 - 255)
animationDrawable.setOneShot(true); 設置單次播放
animationDrawable.setOneShot(false); 設置循環播放
animationDrawable.isRunning(); 判斷動畫是否正在播放
animationDrawable.getNumberOfFrames(); 得到動畫的幀數。
宣教主警戒:拖動進度條設置Alpha值的時候 一定要使用 imageView.postInvalidate(); 方法來通知UI線程重繪屏幕中的imageView 否則會看不到透明的效果 。這里切記切記~~
謝謝CSDN博主宣雨松,牛人一枚。以后還會多多向他學習。