Android animation 動畫背景圖自動播放的實現

來源:互聯網
上載者:User

 

Android動畫背景圖自動播放的實現
我們在開發android應用的時候,經常會遇到類似從網路載入大圖,在載入的過程中,在圖片要顯示的ImageView位置,先顯示一個轉圈的loading動畫圖,給使用者的體驗會更好一些,要實現這個動畫圖很簡單,使用在/res/anim中定義xml的方式,通常使用…. 來實現。 例如:
<?xml version="1.0" encoding="utf-8"?>
<animation-list android:oneshot="false"  
xmlns:android="http://schemas.android.com/apk/res/android">  
  <item android:duration="100" android:drawable="@drawable/loading_1" />  
  <item android:duration="100" android:drawable="@drawable/loading_2" />  
  <item android:duration="100" android:drawable="@drawable/loading_3" />  
  <item android:duration="100" android:drawable="@drawable/loading_4" />  
  <item android:duration="100" android:drawable="@drawable/loading_5" />  
  <item android:duration="100" android:drawable="@drawable/loading_6" />  
  <item android:duration="100" android:drawable="@drawable/loading_7" />  
  <item android:duration="100" android:drawable="@drawable/loading_8" />  
  <item android:duration="100" android:drawable="@drawable/loading_9" />  
  <item android:duration="100" android:drawable="@drawable/loading_10" />  
  <item android:duration="100" android:drawable="@drawable/loading_11" />  
  <item android:duration="100" android:drawable="@drawable/loading_12" />  
</animation-list>   

不過大多數朋友都會遇到的問題是,動畫是做好了,但是介面在載入的時候,動畫並不會自動播放,還得通過螢幕點擊等事件來觸發,這就失去了意義了,實際上,android的動畫AnimationDrawable 組件裡面有個start()方法用於啟動動畫播放,但是這個方法不能直接寫在onClick,onStart,onResume裡面,寫進去也是無效的,無法啟動動畫,只能寫在比如事件監聽當中,於是我們可以使用點小技巧來實現自動播放
目前我知道的有三種方法:

ImageView imageView = (ImageView)findViewById(R.id.xxx);

方法一:使用Runnalbe()來載入
imageView.setBackgroundResource(R.anim.xxxxx);
final AnimationDrawable animationDrawable = (AnimationDrawable)imageView.getBackground();
imageView.post(new Runnable() {
    @Override
        public void run()  {
            animationDrawable.start();
        }
});

注意:此處一定要用getBackground();不能用getdrawable()方法,會沒效果。原因如下:

由於我們使用的是imageView的setBackgroundResource方法設定的資源背景,相當於布局檔案中的android:background屬性,這個屬性是view類的屬性,必須通過getBackground()方法來擷取;而getdrawable()是imageview類的方法,必須通過在代碼中setImageResource(int)(對應布局檔案的android:src)或setImageDrawable(Drawable drawable)方法設定才可以使用getdrawable()方法。
(詳情參考文章:http://www.eoeandroid.com/forum. ... 1&extra=#pid1627412)

方法二:使用AsyncTask非同步載入啟動
imageView.setBackgroundResource(R.anim.xxxxx);
AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getBackground();
RunAnim runAnim=new RunAnim();
runAnim.execute("");

class RunAnim extends AsyncTask<String, String, String> {
        @Override
        protected String doInBackground(String... params) {
            if (!animationDrawable.isRunning()) {
                animationDrawable.stop();
                animationDrawable.start();
            }
            return "";
        }
}

方法三:通過添加addOnPreDrawListener來自動載入   (我是用這個,感覺很好用)
imageView.setBackgroundResource(R.anim.xxxxx);
AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getBackground();  

 //注意這裡,如果你的圖片控制項用的是setImageResource ,你這裡應該使用getDrawable(); 
imageView.getViewTreeObserver().addOnPreDrawListener(preDrawListener);

OnPreDrawListener preDrawListener = new OnPreDrawListener(){
    @Override
    public boolean onPreDraw() {
        animationDrawable.start();
        return true; //必須要有這個true返回
    }
};

以上三種方法經過測試沒有問題,另外網上有一些說使用重寫Activity的onWindowFocusChanged()方法來實現,但是還是有不足,得改變焦點才能觸發,雖然理論可以自動實現改變焦點,感覺還是不甚可取。
(http://www.toplee.com/blog/1345.html)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.