Logo流程(Activity+Handler+Message)


本篇實作簡單的 Logo 流程,慢慢的淡入顯示 Logo 圖示再切換到版權聲明流程,加入 Thread, Message , Handler 類別以控制 Thread 和 Activity 之間的通訊,在 Android 中基於安全性的考量,不予許非主執行緒更改主畫面的元件,一旦違反這個規則,會出現


的例外,所以我們必須考慮使用其他類別搭配達到計時改變的效果,首先準備一張代表 Logo 的圖示,並放入 res -> drawable 資料夾中(記得圖名不可使用英文大寫),接著我們使用 RelativeLayout 並加入 1 個 ImageView 元件,其內容如下


   1:  <?xml version="1.0" encoding="utf-8"?>
   2:  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   3:      android:layout_width="match_parent"
   4:      android:layout_height="match_parent" >
   5:   
   6:      <ImageView
   7:          android:id="@+id/imageView1"
   8:          android:layout_width="fill_parent"
   9:          android:layout_height="fill_parent"
  10:          android:layout_alignParentLeft="true"
  11:          android:layout_alignParentTop="true"
  12:          android:src="@drawable/yellow_logo" />
  13:   
  14:  </RelativeLayout>

第 6 行為 ImageView 元件的開頭
第 7 行為其 id
第 8 ~ 9 行代表即使 ImageView 會填滿父元件
第 10 ~ 11 行對齊父元件的左上方
第 12 行為其資源的來源

接著來看看 Logo 流程的程式碼


LogoFlow.java

   1:  package com.example.helloworld;
   2:   
   3:  import android.annotation.SuppressLint;
   4:  import android.app.Activity;
   5:  import android.content.Intent;
   6:  import android.os.Bundle;
   7:  import android.os.Handler;
   8:  import android.os.Message;
   9:  import android.util.Log;
  10:  import android.widget.ImageView;
  11:   
  12:  @SuppressLint("NewApi")
  13:  public class LogoFlow extends Activity implements Runnable{
  14:   
  15:      ImageView logoView;
  16:      
  17:      Handler handler;
  18:      
  19:      float logoActIndex;
  20:      
  21:      boolean sleeping;
  22:      
  23:      public void onCreate(Bundle savedInstanceState){
  24:          
  25:          super.onCreate(savedInstanceState);
  26:          
  27:          setContentView(R.layout.logoflow);
  28:          
  29:          logoView = (ImageView)findViewById(R.id.imageView1);
  30:          
  31:          logoView.setAlpha(0.0f);
  32:          
  33:          handler = new Handler(){
  34:              
  35:              public void handleMessage(Message msg) {
  36:   
  37:                  Log.v("Trace Log", "revice maessage");
  38:                  
  39:                  if(logoView.getAlpha()<1.0f){
  40:                      logoActIndex+=0.01f;
  41:                      logoView.setAlpha(logoActIndex);
  42:                      Log.v("Trace Log", "test2");
  43:                  }
  44:                  else if(logoView.getAlpha()>=1.0f){
  45:                      
  46:                      LogoFlow.this.finish(); // close activity
  47:                      
  48:                      Log.v("Trace Log", "test3");
  49:                      sleeping = true;// stop Thread
  50:   
  51:                      Intent goAct = new Intent();// new a Intent
  52:                      goAct.setClass(LogoFlow.this, CopyRightFlow.class); // set another activity
  53:                      startActivity(goAct); // start another Activity
  54:                      
  55:                      System.exit(0);// stop program
  56:   
  57:                  }
  58:                  
  59:                  Log.v("Trace Log", ""+logoView.getAlpha());
  60:                  
  61:                  super.handleMessage(msg);
  62:   
  63:              }
  64:              
  65:          };
  66:          
  67:          Thread th = new Thread(this);
  68:          th.start();
  69:      }
  70:      
  71:      public void run() {
  72:          // TODO Auto-generated method stub
  73:          
  74:          while(!sleeping){
  75:              
  76:              try {
  77:                  Thread.sleep(30);
  78:              } catch (InterruptedException e) {
  79:                  // TODO Auto-generated catch block
  80:                  e.printStackTrace();
  81:              }
  82:              
  83:              Message m = new Message();
  84:              
  85:              handler.sendMessage(m);
  86:              
  87:          }
  88:      }
  89:  }

第 13 行 implements Runnable 介面,目的是建立計時器,必須實作其 run 方法(第 71 行)
第 15 行就是 Logo 圖示,待會讓它慢慢淡出
第 17 行 Handler 類別的物件,負責接收 Message 的發送,你可以把它當作接收器,就如同 Activity 的 onTouchEvent( ) 方法會自動接收觸碰的事件
第 19 行控制 logoView 的淡入程度
第 21 行控制執行緒的進行
第 27 行套用上述的佈局檔
第 29 行建立 logoView 物件
第 31 行設定 logoView 的 alpha 值, 0 代表看不見
第 33 ~ 65 行建立 handler 物件, 必須覆寫其 handleMessage( )方法,並在其中加入欲實行的動作
第 39 ~ 43 行為慢慢顯示 logoView 物件的動作
第 44 ~ 57 行為結束該 Activity 的動作,注意第 46,49,55 行,當使用多執行緒並在多 Activity 切換時有可能造成 activity 和 thread 不同步的情況,解決的步驟為 1.先把目前的 Activity 關閉(46行) 2.停止執行緒的進行(49行) 3.使用Intent 開啟新的 Activity (51~53行) 4.使用 System.exit() 結束
第 61 行呼叫父類別的 handleMessage()方法
第 67 ~ 68 行啟動 Thread
第 71 ~ 88 行為覆寫 run () 方法, 在每一次的迴圈中都會建立 Message 物件並傳送訊息,訊息發送後就會被 Handler 的 handleMessage () 方法自動接收,達到計時改變狀態的效果

結果為
開始執行

















2秒後

















跳入下一流程(版權聲明流程)

0 意見:

張貼留言

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Affiliate Network Reviews