特別提醒:本文參考摘自【工匠若水 http://blog.csdn.net/yanbober/article/details/46481171 】強烈建議讀者進入原博客查看學習。
1只磷、Android動畫簡介
1.1分類
Android系統(tǒng)提供了很多豐富的API去實現(xiàn)UI的2D與3D動畫泌绣,最主要的劃分可以分為如下幾類:
Drawable Animation: 這種動畫(也叫Frame動畫阿迈、幀動畫)其實可以劃分到視圖動畫的類別,專門用來一個一個的顯示Drawable的resources惠毁,就像放幻燈片一樣。
View Animation: 視圖動畫在古老的Android版本系統(tǒng)中就已經(jīng)提供了鞠绰,只能被用來設(shè)置View的動畫蜈膨。
**Property Animation: **屬性動畫只對Android 3.0(API 11)以上版本的Android系統(tǒng)才有效,這種動畫可以設(shè)置給任何Object驴一,包括那些還沒有渲染到屏幕上的對象灶壶。這種動畫是可擴展的,可以讓你自定義任何類型和屬性的動畫胸懈。
1.2每種動畫的特點及區(qū)別
Drawable Animation:幀動畫沒有什么好說的恰响,就是把幾張圖片按一定間隔順序顯示出來胚宦,就像播放幻燈片一樣,實際開發(fā)中用處不大枢劝。
View Animation:View動畫只能夠為View添加動畫您旁,如果想為非View對象添加動畫須自己實現(xiàn);且View動畫支持的種類很少军掂;尤其是他改變的是View的繪制效果昨悼,View的屬性沒有改變率触,其位置與大小都不變; View動畫代碼量少,使用簡單方便细燎。
**Property Animation: **屬性動畫彌補了View動畫的缺陷皂甘,可以為一個對象的任意屬性添加動畫偿枕,對象自己的屬性會被真的改變;當對象的屬性變化的時候嗤锉,屬性動畫會自動刷新屏幕墓塌;屬性動畫改變的是對象的真實屬性,而且屬性動畫不止用于View访诱,還可以用于任何對象态坦。
2伞梯、Drawable動畫詳細說明
2.1 實現(xiàn)方式
方式一:java代碼實現(xiàn)
方式二:xml文件實現(xiàn)
2.2 java代碼方式實現(xiàn)
演示效果說明:
點擊“開始”按鈕開始動畫帚屉,點擊“停止”按鈕停止動畫。
步驟1
將圖片資源文件放到drawable_xxx文件目錄下喻旷。
步驟2
activity_main.xml布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp">
<Button
android:onClick="startAnimation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="開始動畫"/>
<Button
android:onClick="stopAnimation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="停止動畫"/>
<ImageView
android:id="@+id/image"
android:layout_marginTop="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
步驟3
java代碼邏輯MainActivity.java文件如下:
public class MainActivity extends AppCompatActivity {
private AnimationDrawable animationDrawable;
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.image);
//創(chuàng)建幀動畫對象
animationDrawable = new AnimationDrawable();
//添加一幀圖片
//參數(shù)二:間隔時間
animationDrawable.addFrame(getResources().getDrawable(R.drawable.iv01), 100);
animationDrawable.addFrame(getResources().getDrawable(R.drawable.iv02), 100);
animationDrawable.addFrame(getResources().getDrawable(R.drawable.iv03), 100);
animationDrawable.addFrame(getResources().getDrawable(R.drawable.iv04), 100);
animationDrawable.addFrame(getResources().getDrawable(R.drawable.iv05), 100);
animationDrawable.addFrame(getResources().getDrawable(R.drawable.iv06), 100);
animationDrawable.addFrame(getResources().getDrawable(R.drawable.iv07), 100);
animationDrawable.addFrame(getResources().getDrawable(R.drawable.iv08), 100);
animationDrawable.addFrame(getResources().getDrawable(R.drawable.iv09), 100);
animationDrawable.addFrame(getResources().getDrawable(R.drawable.iv10), 100);
//設(shè)置ImageView的背景為幀動畫(因為幀動畫是Drawable的一個子類,可以直接設(shè)置)
imageView.setBackground(animationDrawable);
}
/**
* 開始動畫點擊事件
*/
public void startAnimation(View view) {
//設(shè)置是否循環(huán)播放(默認false)
animationDrawable.setOneShot(false);
//開始動畫
animationDrawable.start();
}
/**
* 停止動畫點擊事件
*/
public void stopAnimation(View view) {
//如果該動畫正在執(zhí)行锋谐,則停止動畫
if (animationDrawable.isRunning()) {
animationDrawable.stop();
}
}
}
2.3 XML文件方式實現(xiàn)
演示效果截酷、步驟1、步驟2同上文中的java方式三热。
步驟3
在res文件下創(chuàng)建drawable文件夾(注意,一定是drawable這個文件夾名)呐能;
創(chuàng)建資源文件drawable_animation.xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
<!--指定條目圖片資源以及間隔時間-->
<item android:drawable="@drawable/iv01" android:duration="200"></item>
<item android:drawable="@drawable/iv02" android:duration="200"></item>
<item android:drawable="@drawable/iv03" android:duration="200"></item>
<item android:drawable="@drawable/iv04" android:duration="200"></item>
<item android:drawable="@drawable/iv05" android:duration="200"></item>
<item android:drawable="@drawable/iv06" android:duration="200"></item>
<item android:drawable="@drawable/iv07" android:duration="200"></item>
<item android:drawable="@drawable/iv08" android:duration="200"></item>
<item android:drawable="@drawable/iv08" android:duration="200"></item>
<item android:drawable="@drawable/iv10" android:duration="200"></item>
</animation-list>
步驟4
java代碼邏輯MainActivity.java文件如下:
public class MainActivity extends AppCompatActivity {
private AnimationDrawable animationDrawable;
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.image);
//不通過new得到對象通過下面這種方式得到對象
animationDrawable= (AnimationDrawable) getResources().getDrawable(R.drawable.drawable_animation);
//設(shè)置ImageView的背景為幀動畫(因為幀動畫是Drawable的一個子類催跪,可以直接設(shè)置)
imageView.setBackground(animationDrawable);
}
/**
* 開始動畫點擊事件
*/
public void startAnimation(View view) {
//設(shè)置是否循環(huán)播放(默認false)
animationDrawable.setOneShot(false);
//開始動畫
animationDrawable.start();
}
/**
* 停止動畫點擊事件
*/
public void stopAnimation(View view) {
//如果該動畫正在執(zhí)行懊蒸,則停止動畫
if (animationDrawable.isRunning()) {
animationDrawable.stop();
}
}
}
3悯搔、特別提醒
當用xml方式實現(xiàn)時妒貌,AnimationDrawable的start()方法最好別在Activity的onCreate方法中調(diào)運,因為AnimationDrawable還未完全附著到window上灌曙,所以最好的調(diào)運時機是onWindowFocusChanged()方法中在刺。
4、總結(jié)
以上就是幀動畫的基本實現(xiàn)魄幕,由于該動畫的局限性颖杏,實際開發(fā)中很少有用到,掌握上文中所描述的翼抠,就基本能應(yīng)付實際開發(fā)中的應(yīng)用場景了获讳。