亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android動畫之逐幀動畫(Frame Animation)實例詳解

2020-04-11 11:04:03
字體:
來源:轉載
供稿:網友

本文實例分析了Android動畫之逐幀動畫。分享給大家供大家參考,具體如下:

在開始實例講解之前,先引用官方文檔中的一段話:

Frame動畫是一系列圖片按照一定的順序展示的過程,和放電影的機制很相似,我們稱為逐幀動畫。Frame動畫可以被定義在XML文件中,也可以完全編碼實現。

如果被定義在XML文件中,我們可以放置在/res下的anim或drawable目錄中(/res/[anim | drawable]/filename.xml),文件名可以作為資源ID在代碼中引用;如果由完全由編碼實現,我們需要使用到AnimationDrawable對象。

如果是將動畫定義在XML文件中的話,語法如下:

<?xml version="1.0" encoding="utf-8"?><animation-list xmlns:android="http://schemas.android.com/apk/res/android"  android:oneshot=["true" | "false"] >  <item    android:drawable="@[package:]drawable/drawable_resource_name"    android:duration="integer" /></animation-list>

需要注意的是:

<animation-list>元素是必須的,并且必須要作為根元素,可以包含一或多個<item>元素;android:onshot如果定義為true的話,此動畫只會執行一次,如果為false則一直循環。
<item>元素代表一幀動畫,android:drawable指定此幀動畫所對應的圖片資源,android:druation代表此幀持續的時間,整數,單位為毫秒。

文檔接下來的示例我就不在解說了,因為接下來我們也要結合自己的實例演示一下這個過程。

我們新建一個名為anim的工程,將四張連續的圖片分別命名為f1.png,f2.png,f3.png,f4.png,放于drawable目錄,然后新建一個frame.xml文件:

<?xml version="1.0" encoding="utf-8"?><animation-list xmlns:android="http://schemas.android.com/apk/res/android"  android:oneshot="false">  <item android:drawable="@drawable/f1" android:duration="300" />  <item android:drawable="@drawable/f2" android:duration="300" />  <item android:drawable="@drawable/f3" android:duration="300" />  <item android:drawable="@drawable/f4" android:duration="300" /></animation-list>

我們可以將frame.xml文件放置于drawable或anim目錄,官方文檔上是放到了drawable中了,大家可以根據喜好來放置,放在這兩個目錄都是可以運行的。

然后介紹一下布局文件res/layout/frame.xml:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView  android:id="@+id/frame_image"  android:layout_width="fill_parent"  android:layout_height="fill_parent"  android:layout_weight="1"/> <Button  android:layout_width="fill_parent"  android:layout_height="wrap_content"  android:text="stopFrame"  android:onClick="stopFrame"/> <Button  android:layout_width="fill_parent"  android:layout_height="wrap_content"  android:text="runFrame"  android:onClick="runFrame"/></LinearLayout>

我們定義了一個ImageView作為動畫的載體,然后定義了兩個按鈕,分別是停止和啟動動畫。

接下來介紹一下如何通過加載動畫定義文件來實現動畫的效果。我們首先會這樣寫:

package com.scott.anim;import android.app.Activity;import android.graphics.drawable.AnimationDrawable;import android.graphics.drawable.Drawable;import android.os.Bundle;import android.view.View;import android.widget.ImageView;public class FrameActivity extends Activity {  private ImageView image;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.frame);    image = (ImageView) findViewById(R.id.frame_image);    image.setBackgroundResource(R.anim.frame);    AnimationDrawable anim = (AnimationDrawable) image.getBackground();    anim.start();  }}

看似十分完美,跟官方文檔上寫的一樣,然而當我們運行這個程序時會發現,它只停留在第一幀,并沒有出現我們期望的動畫,也許你會失望的說一句:“Why?”,然后你把相應的代碼放在一個按鈕的點擊事件中,動畫就順利執行了,再移回到onCreate中,還是沒效果,這個時候估計你會氣急敗壞的吼一句:“What the fuck!”。但是,什么原因呢?如何解決呢?

出現這種現象是因為當我們在onCreate中調用AnimationDrawable的start方法時,窗口Window對象還沒有完全初始化,AnimationDrawable不能完全追加到窗口Window對象中,那么該怎么辦呢?我們需要把這段代碼放在onWindowFocusChanged方法中,當Activity展示給用戶時,onWindowFocusChanged方法就會被調用,我們正是在這個時候實現我們的動畫效果。當然,onWindowFocusChanged是在onCreate之后被調用的,如圖:

然后我們需要重寫一下代碼:

package com.scott.anim;import android.app.Activity;import android.graphics.drawable.AnimationDrawable;import android.graphics.drawable.Drawable;import android.os.Bundle;import android.view.View;import android.widget.ImageView;public class FrameActivity extends Activity {  private ImageView image;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.frame);    image = (ImageView) findViewById(R.id.frame_image);  }  @Override  public void onWindowFocusChanged(boolean hasFocus) {    super.onWindowFocusChanged(hasFocus);    image.setBackgroundResource(R.anim.frame);    AnimationDrawable anim = (AnimationDrawable) image.getBackground();    anim.start();  }}

運行一下,動畫就可以正常顯示了。

如果在有些場合,我們需要用純代碼方式實現一個動畫,我們可以這樣寫:

AnimationDrawable anim = new AnimationDrawable();for (int i = 1; i <= 4; i++) {  int id = getResources().getIdentifier("f" + i, "drawable", getPackageName());  Drawable drawable = getResources().getDrawable(id);  anim.addFrame(drawable, 300);}anim.setOneShot(false);image.setBackgroundDrawable(anim);anim.start();

完整的FrameActivity.java代碼如下:

package com.scott.anim;import android.app.Activity;import android.graphics.drawable.AnimationDrawable;import android.graphics.drawable.Drawable;import android.os.Bundle;import android.view.View;import android.widget.ImageView;public class FrameActivity extends Activity {  private ImageView image;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.frame);    image = (ImageView) findViewById(R.id.frame_image);  }  @Override  public void onWindowFocusChanged(boolean hasFocus) {    super.onWindowFocusChanged(hasFocus);    image.setBackgroundResource(R.anim.frame); //將動畫資源文件設置為ImageView的背景    AnimationDrawable anim = (AnimationDrawable) image.getBackground(); //獲取ImageView背景,此時已被編譯成AnimationDrawable    anim.start();  //開始動畫  }  public void stopFrame(View view) {    AnimationDrawable anim = (AnimationDrawable) image.getBackground();    if (anim.isRunning()) { //如果正在運行,就停止      anim.stop();    }  }  public void runFrame(View view) {    //完全編碼實現的動畫效果    AnimationDrawable anim = new AnimationDrawable();    for (int i = 1; i <= 4; i++) {      //根據資源名稱和目錄獲取R.java中對應的資源ID      int id = getResources().getIdentifier("f" + i, "drawable", getPackageName());      //根據資源ID獲取到Drawable對象      Drawable drawable = getResources().getDrawable(id);      //將此幀添加到AnimationDrawable中      anim.addFrame(drawable, 300);    }    anim.setOneShot(false); //設置為loop    image.setBackgroundDrawable(anim); //將動畫設置為ImageView背景    anim.start();  //開始動畫  }}

希望本文所述對大家Android程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人黄色在线播放| 色阁综合伊人av| 欧美巨猛xxxx猛交黑人97人| 国产精品视频1区| 福利视频一区二区| 亚洲韩国欧洲国产日产av| 久久99视频精品| 亚洲天堂免费观看| 中文字幕av一区中文字幕天堂| 欧美第一淫aaasss性| 精品电影在线观看| 亚洲精品在线不卡| 69久久夜色精品国产69| 日韩中文在线视频| 亚洲国产精久久久久久久| 欧美一区深夜视频| 欧美黄色www| 精品久久久一区| 欧美激情综合色| 色多多国产成人永久免费网站| 国产婷婷色综合av蜜臀av| 日韩av免费在线播放| 久久视频这里只有精品| 欧美有码在线视频| 成人一区二区电影| 国产精品久久久久久久久久久久| 欧美高清在线视频观看不卡| 亚洲第一福利在线观看| 欧美成人免费全部观看天天性色| 国产精品视频大全| 国产视频精品在线| 不卡av在线网站| 欧美中文在线视频| 日韩**中文字幕毛片| 亚洲精品永久免费精品| 少妇高潮 亚洲精品| 久久手机免费视频| 国产在线久久久| 欧美精品videosex极品1| 亚洲无限乱码一二三四麻| 国产精品免费久久久久久| 91精品国产一区| 一区二区三区四区视频| 91麻豆国产精品| 97国产精品免费视频| 亚洲免费小视频| 91av视频在线免费观看| 成人字幕网zmw| 久久免费视频观看| 色先锋资源久久综合5566| 国产精品视频白浆免费视频| 色999日韩欧美国产| 欧美又大又粗又长| 精品国偷自产在线| 亚洲午夜精品久久久久久性色| 在线视频欧美日韩精品| 久久久成人精品视频| 日韩精品在线视频美女| 国产精品中文字幕在线观看| 国产一区红桃视频| 欧美美女18p| 日韩免费电影在线观看| 懂色av一区二区三区| 国产精品自在线| 97视频免费在线观看| 精品久久久久久中文字幕大豆网| 亚洲精品久久视频| 国产乱人伦真实精品视频| 欧洲亚洲妇女av| 国产91色在线|免| 亚洲护士老师的毛茸茸最新章节| 亚洲第一免费网站| 欧美性感美女h网站在线观看免费| 久久精品视频在线观看| 久久视频在线观看免费| 亚洲精品自在久久| 亚洲欧洲偷拍精品| 欧美电影电视剧在线观看| 69av在线播放| 久久视频在线直播| 欧美成人在线网站| 日韩在线视频中文字幕| 浅井舞香一区二区| 国产在线观看91精品一区| 欧美日韩一区二区在线| 欧美超级乱淫片喷水| 国产精品一区二区三区在线播放| 亚洲欧美一区二区激情| 久久天天躁狠狠躁老女人| 欧美日本国产在线| 国产精品视频在线播放| 91综合免费在线| 日韩免费观看av| 欧美另类老肥妇| 欧美成人性色生活仑片| 久久成人18免费网站| 日本久久91av| 欧美重口另类videos人妖| 欧美乱妇40p| 在线日韩中文字幕| 国产精品v日韩精品| 亚洲free性xxxx护士白浆| 国产精品美女免费视频| 日韩欧美成人区| 亚洲精品丝袜日韩| 亚洲国产另类 国产精品国产免费| 亚洲日本中文字幕免费在线不卡| 亚洲一区二区久久久| 91沈先生在线观看| 国产欧美精品一区二区| 日韩亚洲国产中文字幕| 国产午夜一区二区| 国产精品久久久久秋霞鲁丝| 日本免费在线精品| 欧美专区第一页| 日本道色综合久久影院| 2019中文字幕免费视频| 黑人与娇小精品av专区| 国产成人免费av电影| 国产91精品最新在线播放| 国内精品久久久久久影视8| 亚洲最大av在线| 欧美日本高清一区| 国产精品视频自拍| 国产成人av在线| 欧美成在线观看| 高清在线视频日韩欧美| 秋霞午夜一区二区| 不卡av在线播放| 久久伊人精品视频| 黄色成人在线播放| 国产精品久久久久久久久久三级| 国产精品大片wwwwww| 亚洲国产精品va在看黑人| 97婷婷涩涩精品一区| 中文字幕亚洲情99在线| 国产91精品久久久| 亚洲天堂一区二区三区| 日韩欧美亚洲国产一区| 久久综合国产精品台湾中文娱乐网| 最近2019年中文视频免费在线观看| 亚洲国产欧美在线成人app| 日韩成人激情在线| 国产v综合v亚洲欧美久久| 一二美女精品欧洲| 国产在线999| 成人激情av在线| 亚洲欧美在线播放| 日韩av在线天堂网| 亚洲国产成人久久综合一区| 国产99久久精品一区二区永久免费| 日韩一级裸体免费视频| 一区二区三区四区精品| 国产精品亚洲精品| 国产91对白在线播放| 国产精品igao视频| 国产亚洲精品高潮| 日韩亚洲成人av在线| 欧美野外猛男的大粗鳮| 热久久免费国产视频| 亚洲电影成人av99爱色| 欧美另类在线播放| 青草热久免费精品视频| 成人国产精品日本在线|