Android六种加载动态图的方式(包括动态背景和加载动态图片)之四

2014-09-02 14:45:27

Tags: android


其实这篇文章已经写的很全面,我只是用了一下将它加入到我的demo中,并实现了文章中最后提到的一个加载方式,并做了一些稍微改动。(此处:向前辈致敬!)

这种方式的原理就是加载一个动画,并在ImageView中显示出来,大体上也是分三步

第一步:

在res/anim文件夹下创建一个动画文件,dynamic4.xml,内容如下:

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <animation-list xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:oneshot="false" >  
  4.   
  5.     <item  
  6.         android:drawable="@drawable/tcc1"  
  7.         android:duration="100"/>  
  8.     <item  
  9.         android:drawable="@drawable/tcc2"  
  10.         android:duration="100"/>  
  11.     <item  
  12.         android:drawable="@drawable/tcc3"  
  13.         android:duration="100"/>  
  14.     <item  
  15.         android:drawable="@drawable/tcc4"  
  16.         android:duration="100"/>  
  17.     <item  
  18.         android:drawable="@drawable/tcc5"  
  19.         android:duration="100"/>  
  20.     <item  
  21.         android:drawable="@drawable/tcc6"  
  22.         android:duration="100"/>  
  23.     <item  
  24.         android:drawable="@drawable/tcc7"  
  25.         android:duration="100"/>  
  26.      
  27.   
  28. </animation-list>  

第二步:

 

加载配置文件,这个跟我们平时加载配置文件是一样的,在layout建立activity_dynamic4.xml

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:gravity="center_horizontal"  
  6.     android:orientation="vertical" >  
  7.   
  8.     <LinearLayout  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="wrap_content"  
  11.         android:gravity="center_horizontal"  
  12.         android:orientation="horizontal" >  
  13.   
  14.         <Button  
  15.             android:id="@+id/btn41"  
  16.             android:layout_width="wrap_content"  
  17.             android:layout_height="wrap_content"  
  18.             android:text="第二种加载方法" />  
  19.   
  20.         <Button  
  21.             android:id="@+id/btn42"  
  22.             android:layout_width="wrap_content"  
  23.             android:layout_height="wrap_content"  
  24.             android:text="第三种加载方法" />  
  25.   
  26.         <Button  
  27.             android:id="@+id/btn43"  
  28.             android:layout_width="wrap_content"  
  29.             android:layout_height="wrap_content"  
  30.             android:text="第四种加载方法" />  
  31.     </LinearLayout>  
  32.   
  33.     <ImageView  
  34.         android:id="@+id/imageView4"  
  35.         android:layout_width="wrap_content"  
  36.         android:layout_height="wrap_content" />  
  37.   
  38. </LinearLayout>  



 

第三步:

打开我们的DynamicActivity4文件,加入以下代码:

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. package com.tcc.dynamicbackground;  
  2.   
  3. import android.app.Activity;  
  4. import android.graphics.drawable.AnimationDrawable;  
  5. import android.os.AsyncTask;  
  6. import android.os.Bundle;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.view.ViewTreeObserver.OnPreDrawListener;  
  10. import android.widget.Button;  
  11. import android.widget.ImageView;  
  12.   
  13. public class DynamicActivity4 extends Activity implements OnClickListener {  
  14.     private ImageView imageView;  
  15.     private Button btn41, btn42, btn43;  
  16.     AnimationDrawable animationDrawable;  
  17.   
  18.     @Override  
  19.     protected void onCreate(Bundle savedInstanceState) {  
  20.         // TODO Auto-generated method stub  
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.activity_dynamic4);  
  23.         init();  
  24.     }  
  25.   
  26.     private void init() {  
  27.         // TODO Auto-generated method stub  
  28.         btn41 = (Button) findViewById(R.id.btn41);  
  29.         btn41.setOnClickListener(this);  
  30.         btn42 = (Button) findViewById(R.id.btn42);  
  31.         btn42.setOnClickListener(this);  
  32.         btn43 = (Button) findViewById(R.id.btn43);  
  33.         btn43.setOnClickListener(this);  
  34.         imageView = (ImageView) findViewById(R.id.imageView4);  
  35.         imageView.setOnClickListener(this);  
  36.         imageView.setBackgroundResource(R.anim.dynamic4);  
  37.         animationDrawable = (AnimationDrawable) imageView.getBackground();  
  38.     }  
  39.   
  40.     @Override  
  41.     public void onClick(View v) {  
  42.         // TODO Auto-generated method stub  
  43.         switch (v.getId()) {  
  44.         case R.id.btn41:  
  45.             playAnimation1();  
  46.             break;  
  47.         case R.id.btn42:  
  48.             playAnimation2();  
  49.             break;  
  50.         case R.id.btn43:  
  51.             playAnimation3();  
  52.             break;  
  53.         case R.id.imageView4:  
  54.             animationDrawable.stop();  
  55.             break;  
  56.         default:  
  57.             break;  
  58.         }  
  59.     }  
  60.   
  61.     // 方法一:在Activity启动时会自动运行动画  
  62.     @Override  
  63.     public void onWindowFocusChanged(boolean hasFocus)  
  64.   
  65.     {  
  66.         animationDrawable.start();  
  67.   
  68.         super.onWindowFocusChanged(hasFocus);  
  69.   
  70.     }  
  71.   
  72.     void playAnimation1() {  
  73.         // 方法二:使用Runnalbe()来加载  
  74.   
  75.         imageView.post(new Runnable() {  
  76.   
  77.             @Override  
  78.             public void run() {  
  79.                 // TODO Auto-generated method stub  
  80.                 animationDrawable.start();  
  81.             }  
  82.         });  
  83.         // 注意:此处一定要用getBackground();不能用getdrawable()方法,会没效果。原因如下:  
  84.         // 由于我们使用的是imageView的setBackgroundResource方法设置的资源背景,相当于布局文件中的android:background属性,  
  85.         // 这个属性是view类的属性,必须通过getBackground()方法来获取;而getdrawable()是imageview类的方法,  
  86.         // 必须通过在代码中setImageResource(int)(对应布局文件的android:src)  
  87.         // 或setImageDrawable(Drawable drawable)方法设置才可以使用getdrawable()方法。  
  88.     }  
  89.   
  90.     void playAnimation2() {  
  91.         // 方法三:使用AsyncTask异步加载启动  
  92.         class RunAnim extends AsyncTask<String, String, String> {  
  93.   
  94.             @Override  
  95.             protected String doInBackground(String... params) {  
  96.                 // TODO Auto-generated method stub  
  97.                 if (!animationDrawable.isRunning()) {  
  98.                     animationDrawable.stop();  
  99.                     animationDrawable.start();  
  100.                 }  
  101.                 return "";  
  102.             }  
  103.         }  
  104.         RunAnim runAnim = new RunAnim();  
  105.         runAnim.execute("");  
  106.     }  
  107.   
  108.     void playAnimation3() {  
  109.         // 方法四:通过添加addOnPreDrawListener来自动加载 (我是用这个,感觉很好用)  
  110.   
  111.         // 注意这里,如果你的图片控件用的是setImageResource ,你这里应该使用getDrawable();  
  112.   
  113.         OnPreDrawListener preDrawListener = new OnPreDrawListener() {  
  114.             @Override  
  115.             public boolean onPreDraw() {  
  116.                 animationDrawable.start();  
  117.                 return true// 必须要有这个true返回  
  118.             }  
  119.         };  
  120.         imageView.getViewTreeObserver().addOnPreDrawListener(preDrawListener);  
  121.     }  
  122.   
  123. }  

其中第三中方法时不时的会出错,能避开就尽量不要用。

 

你试试如何?

上一篇: Android所有系统资源图标android.R.drawable查看

下一篇: 游戏嵌入Webview网页