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

                

一、    角色描述

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

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

 

ExpandedBlockStart.gif 代码
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值