前言
- 動(dòng)畫的使用 是
Android
開發(fā)中常用的知識(shí) - 可是動(dòng)畫的種類繁多、使用復(fù)雜,每當(dāng)需要 采用自定義動(dòng)畫 實(shí)現(xiàn) 復(fù)雜的動(dòng)畫效果時(shí),很多開發(fā)者就顯得束手無策
- 本文將詳細(xì)介紹
Android
動(dòng)畫中 逐幀動(dòng)畫的原理 & 使用
動(dòng)畫類型
Carson帶你學(xué)
Android
動(dòng)畫系列文章:
Carson帶你學(xué)Android:一份詳細(xì)&全面的動(dòng)畫知識(shí)學(xué)習(xí)攻略
Carson帶你學(xué)Android:常見的三種動(dòng)畫類型
Carson帶你學(xué)Android:補(bǔ)間動(dòng)畫學(xué)習(xí)教程
Carson帶你學(xué)Android:屬性動(dòng)畫學(xué)習(xí)教程
Carson帶你學(xué)Android:逐幀動(dòng)畫學(xué)習(xí)教程
Carson帶你學(xué)Android:自定義動(dòng)畫神器-估值器(含實(shí)例教學(xué))
Carson帶你學(xué)Android:自定義動(dòng)畫神器-插值器(含實(shí)例教學(xué))
目錄
目錄
1. 作用對(duì)象
視圖控件(View
)
- 如
Android
的TextView、Button
等等- 不可作用于
View
組件的屬性,如:顏色、背景、長度等等
2. 原理
將動(dòng)畫拆分為幀的形式,且定義每一幀等于每一張圖片,最后按序播放一組預(yù)先定義好的圖片。
3. 具體使用
實(shí)例效果如下:
效果圖
具體使用步驟如下:
// 步驟1:將動(dòng)畫資源(即每張圖片資源)放到 drawable文件夾里
// 技巧:找到自己需要的gif動(dòng)畫,用 gif分解軟件(如 GifSplitter)將 gif 分解成一張張圖片即可
// 步驟2:設(shè)置、啟動(dòng)動(dòng)畫
// 分兩種方式:xml跟java
// 方式1:xml
// 1. 在 res/drawable的文件夾里創(chuàng)建動(dòng)畫效果.xml文件 - knight_attack.xml
<?xml version="1.0" encoding="utf-8"?>
<animation-list
xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true" // 設(shè)置是否只播放一次,默認(rèn)為false
>
// item = 動(dòng)畫圖片資源;duration = 設(shè)置一幀持續(xù)時(shí)間(ms)
<item android:drawable="@drawable/a0" android:duration="100"/>
<item android:drawable="@drawable/a1" android:duration="100"/>
<item android:drawable="@drawable/a2" android:duration="100"/>
<item android:drawable="@drawable/a3" android:duration="100"/>
<item android:drawable="@drawable/a4" android:duration="100"/>
<item android:drawable="@drawable/a5" android:duration="100"/>
<item android:drawable="@drawable/a6" android:duration="100"/>
<item android:drawable="@drawable/a7" android:duration="100"/>
<item android:drawable="@drawable/a8" android:duration="100"/>
<item android:drawable="@drawable/a9" android:duration="100"/>
<item android:drawable="@drawable/a10" android:duration="100"/>
<item android:drawable="@drawable/a11" android:duration="100"/>
<item android:drawable="@drawable/a12" android:duration="100"/>
<item android:drawable="@drawable/a13" android:duration="100"/>
<item android:drawable="@drawable/a14" android:duration="100"/>
<item android:drawable="@drawable/a15" android:duration="100"/>
<item android:drawable="@drawable/a16" android:duration="100"/>
<item android:drawable="@drawable/a17" android:duration="100"/>
<item android:drawable="@drawable/a18" android:duration="100"/>
<item android:drawable="@drawable/a19" android:duration="100"/>
<item android:drawable="@drawable/a20" android:duration="100"/>
<item android:drawable="@drawable/a21" android:duration="100"/>
<item android:drawable="@drawable/a22" android:duration="100"/>
<item android:drawable="@drawable/a23" android:duration="100"/>
<item android:drawable="@drawable/a24" android:duration="100"/>
<item android:drawable="@drawable/a25" android:duration="100"/>
</animation-list>
// 2. 載入 & 啟動(dòng)動(dòng)畫
public class FrameActivity extends AppCompatActivity {
private Button btn_startFrame,btn_stopFrame;
private ImageView iv;
private AnimationDrawable animationDrawable;
iv = (ImageView) findViewById(R.id.iv);
btn_startFrame = (Button) findViewById(R.id.btn_startFrame);
btn_stopFrame = (Button) findViewById(R.id.btn_stopFrame);
// 載入動(dòng)畫
btn_startFrame.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 1. 設(shè)置動(dòng)畫
iv.setImageResource(R.drawable.knight_attack);
// 2. 獲取動(dòng)畫對(duì)象
animationDrawable = (AnimationDrawable) iv.getDrawable();
// 3. 啟動(dòng)動(dòng)畫
animationDrawable.start();
}
});
// 停止動(dòng)畫
btn_stopFrame.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 1. 設(shè)置動(dòng)畫
iv.setImageResource(R.drawable.knight_attack);
// 2. 獲取動(dòng)畫對(duì)象
animationDrawable = (AnimationDrawable) iv.getDrawable();
// 3. 暫停動(dòng)畫
animationDrawable.stop();
}
});
}
}
// 方式2:java
// 直接從drawable文件夾獲取動(dòng)畫資源(圖片)
animationDrawable = new AnimationDrawable();
for (int i = 0; i <= 25; i++) {
int id = getResources().getIdentifier("a" + i, "drawable", getPackageName());
Drawable drawable = getResources().getDrawable(id);
animationDrawable.addFrame(drawable, 100);
}
// 載入動(dòng)畫
btn_startFrame.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 1. 獲取資源對(duì)象
iv.setImageDrawable(animationDrawable);
// 2. 停止動(dòng)畫
// 特別注意:在動(dòng)畫start()之前要先stop(),不然在第一次動(dòng)畫之后會(huì)停在最后一幀,這樣動(dòng)畫就只會(huì)觸發(fā)一次
animationDrawable.stop();
// 3. 啟動(dòng)動(dòng)畫
animationDrawable.start();
}
});
// 停止動(dòng)畫
btn_stopFrame.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 1. 獲取資源對(duì)象
iv.setImageDrawable(animationDrawable);
// 2. 停止動(dòng)畫
animationDrawable.stop();
}
});
4. 特點(diǎn)
- 優(yōu)點(diǎn):使用簡單、方便
- 缺點(diǎn):容易引起
OOM
,因?yàn)闀?huì)使用大量 & 尺寸較大的圖片資源
盡量避免使用尺寸較大的圖片
5. 應(yīng)用場景
較為復(fù)雜的個(gè)性化動(dòng)畫效果。
使用時(shí)一定要避免使用尺寸較大的圖片,否則會(huì)引起OOM
6. 總結(jié)
- 本文對(duì)
Android
動(dòng)畫中的 逐幀動(dòng)畫 進(jìn)行了詳細(xì)分析 - Carson帶你學(xué)
Android
動(dòng)畫系列文章:
Carson帶你學(xué)Android:一份詳細(xì)&全面的動(dòng)畫知識(shí)學(xué)習(xí)攻略
Carson帶你學(xué)Android:常見的三種動(dòng)畫類型
Carson帶你學(xué)Android:補(bǔ)間動(dòng)畫學(xué)習(xí)教程
Carson帶你學(xué)Android:屬性動(dòng)畫學(xué)習(xí)教程
Carson帶你學(xué)Android:逐幀動(dòng)畫學(xué)習(xí)教程
Carson帶你學(xué)Android:自定義動(dòng)畫神器-估值器(含實(shí)例教學(xué))
Carson帶你學(xué)Android:自定義動(dòng)畫神器-插值器(含實(shí)例教學(xué))
歡迎關(guān)注Carson_Ho的簡書
不定期分享關(guān)于安卓開發(fā)的干貨,追求短、平、快,但卻不缺深度。