Android 小項目之--消息、線程、動畫顯示圖片(附源碼)

it2022-05-09  28

                

一、    角色描述

1.Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。

2.Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper(从Message Queue取出)所送来的消息。

3. Message Queue(消息队列):用来存放线程放入的消息。

4.线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue。

每一个线程里可含有一个Looper对象以及一个MessageQueue数据结构。在你的应用程序里,可以定义Handler的子类别来接收Looper所送出的消息。

 

在你的Android程序里,新诞生一个线程,或执行 (Thread)时,并不会自动建立其Message Loop。

Android里并没有Global的Message Queue数据结构,例如,不同APK里的对象不能透过Massage Queue来交换讯息(Message)。

例如:线程A的Handler对象可以传递消息给别的线程,让别的线程B或C等能送消息来给线程A(存于A的Message Queue里)。

线程A的Message Queue里的讯息,只有线程A所属的对象可以处理。

使用Looper.myLooper可以取得当前线程的Looper对象。

使用mHandler = new EevntHandler(Looper.myLooper()); 可用来构造当前线程的Handler对象;其中,EevntHandler是自已实现的Handler的子类别。

使用mHandler = new EevntHandler(Looper.getMainLooper()); 可诞生用来处理main线程的Handler对象;其中,EevntHandler是自已实现的Handler的子类别。

 

这样描述可能太抽像,下面举几个实际的例子来说明:

二、    举例

1. 同线程内不同组件间的消息传递

Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。你的应用程序可以产生许多个线程。而一个线程可以有许多个组件,这些组件之间常常需要互相交换讯息。如果有这种需要,您可以替线程构造一个Looper对象,来担任讯息交换的管理工作。Looper对象会建立一个MessageQueue数据结构来存放各对象传来的消息(包括UI事件或System事件等)。如下图:

每一个线程里可含有一个Looper对象以及一个MessageQueue数据结构。在你的应用程序里,可以定义Handler的子类别来接收Looper所送出的消息。

 --------------------------打醬油---------------------------

運行效果圖:

  繼上篇文章顯示時針的例子,這次在android線程裏面我又加入了動畫的方式,讓線程更好的幫助我們做更好的動畫效果,本例子,將用到四張圖片,每張圖片出來的顯示方式都不一樣,每隔三秒顯示一張不同的圖片,其顯示方式都不一樣,具體操作看代碼:

 

     private   static  final  int  my_key = 0x123 ;     private   int  a = 0 ;     private   int [] myImage = {            R.drawable.aa,            R.drawable.bb,            R.drawable.cc,            R.drawable.dd    };

動畫效果的方案你可以參考:http://www.cnblogs.com/TerryBlog/archive/2010/05/30/1747311.html或者http://www.cnblogs.com/TerryBlog/archive/2010/05/31/1748628.html

 

線程的效果方案你可以參考:http://www.cnblogs.com/TerryBlog/archive/2010/06/01/1749516.html

本篇不過多解釋代碼,有任何問題可以參考以上三篇文章,下麵給出效果的全部代碼:

 

代码 package  cn.terry; import  android.app.Activity;  import  android.os.Bundle; import  android.os.Handler; import  android.os.Message;  import  android.view.animation.AlphaAnimation; import  android.view.animation.Animation; import  android.view.animation.RotateAnimation; import  android.view.animation.ScaleAnimation; import  android.view.animation.TranslateAnimation; import  android.widget. * ; public   class  testHandler  extends  Activity  implements  Runnable {      private   static   final   int  my_key = 0x123 ;     private   int  a = 0 ;     private   int [] myImage = {            R.drawable.aa,            R.drawable.bb,            R.drawable.cc,            R.drawable.dd    };     private  Handler myHandler;     private  Thread myThread;      private  ImageView myImageView;     private  Animation myAnimationAlpha;      private  Animation myAnimationScale;         private  Animation myAnimationTranslate;         private  Animation myAnimationRotate;      /**  Called when the activity is first created.  */     @Override     public   void  onCreate(Bundle savedInstanceState) {         super .onCreate(savedInstanceState);        setContentView(R.layout.main);        myImageView = (ImageView)findViewById(R.id.ImageView01);         myAnimationAlpha = new  AlphaAnimation( 0.1f 1.0f );        myAnimationAlpha.setDuration( 3000 );        myAnimationScale = new  ScaleAnimation( 0.0f 1.4f 0.0f 1.4f ,                Animation.RELATIVE_TO_SELF,  0.5f , Animation.RELATIVE_TO_SELF,  0.5f );        myAnimationScale.setDuration( 3000 );                myAnimationTranslate = new  TranslateAnimation( 30.0f - 80.0f 30.0f 300.0f );        myAnimationTranslate.setDuration( 3000 );               myAnimationRotate = new  RotateAnimation( 0.0f + 350.0f ,               Animation.RELATIVE_TO_SELF, 0.5f ,Animation.RELATIVE_TO_SELF,  0.5f );       myAnimationRotate.setDuration( 3000 );        //  myLinearLayout.setBackgroundColor(Color.WHITE);         myHandler = new  Handler()        {            @Override             public   void  handleMessage(Message msg) {                 //  TODO Auto-generated method stub                  switch  (msg.what) {                 case  testHandler.my_key:                     switch  (a) {                     case   0 :                         myImageView.startAnimation(myAnimationAlpha);                                                 break ;                      case   1 :                         myImageView.startAnimation(myAnimationScale);                                                break ;                     case   2 :                         myImageView.startAnimation(myAnimationTranslate);                                                 break ;                     case   3 :                         myImageView.startAnimation(myAnimationRotate);                                                break ;                     default :                         break ;                    }                    myImageView.setImageResource(myImage[a - 1 ]);                    myImageView.setScaleType(ImageView.ScaleType.FIT_XY);                     // myImageView.setLayoutParams(new LayoutParams(300, 200));                                           if (a == myImage.length)                     {                         a = 0 ;                     }                                         break ;                 default :                     break ;                }                 super .handleMessage(msg);            }        };                myThread = new  Thread( this );        myThread.start();    }    @Override     public   void  run() {         //  TODO Auto-generated method stub          try  {              do              {                 a ++ ;                Thread.sleep( 4000 );                 Message msg = new  Message();                 msg.what = testHandler.my_key;                 myHandler.sendMessage(msg);             }              while (Thread.interrupted() == false );        }  catch  (Exception e) {             //  TODO: handle exception             e.printStackTrace();        }                                    }}

 

 

 

源碼下載:/Files/TerryBlog/testHandler.rar

 

如果你有什麽疑問或者建議你可以  QQ:285735942  或者Email:terryyhl@gmail.com

 

 

转载于:https://www.cnblogs.com/TerryBlog/archive/2010/06/02/1749942.html


最新回复(0)