Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android 小項目之--消息、線程、動畫顯示圖片(附源碼)

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

編輯: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.fengfly.com/plus/view-181802-1.html或者http://www.fengfly.com/plus/view-181804-1.html

 

線程的效果方案你可以參考:hthttp://www.fengfly.com/plus/view-181805-1.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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved