本篇實作簡單的 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 意見:
張貼留言