一些app在啓動的時候通常會有一個歡迎界面,一直想知道是怎麼樣實現的,所以結合手頭的書籍寫了一個自己的歡迎界面。在歡迎界面中漸變的顯示了兩張圖片。
歡迎界面WelcomeView是繼承了SurfaceView並實現了接口SurfaceHolder.Callback
在MainActivity中有一個handler來處理消息,從而選擇是加載歡迎界面,還是回到MainActivity.
該實例是從《Android應用案例開發大全》第一章中的實例中抽取出來的。
之前之所以不知道歡迎界面如何實現纔好,主要是沒有想到用handler來實現這樣的一個過程。現在有了這樣一個處理的模式,以後爲每個app增加一個歡迎界面都不是難事了。
整個例子的實現步驟如下:
onCreate()發送了一個meg.what爲0 à handler去處理調用了goToWelcomeView() à WelcomeView得到了調用 à 在線程執行完後發送一個meg.what爲1 àhandler接着調用了goToMainActivity()回到主界面
MainActivity.java
package com.nuist.welcomeview;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
public class MainActivity extends Activity {
WelcomeView wv;
Handler hd = new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
switch(msg.what){
case 0:
goToWelcomeView();//當收到mes.what爲0時,顯示歡迎界面
break;
case 1:
goToMainActivity();//顯示主界面
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.hd.sendEmptyMessage(0); //發送mes.what爲0,這樣就能觸發goToWelcomeView()
}
public void goToWelcomeView(){
/**
* 如果WelcomeView wv爲空,則新建一個
*/
if(wv == null){
wv = new WelcomeView(this);
}
/**
* 顯示WelcomeView
*/
setContentView(wv);
}
public void goToMainActivity(){
setContentView(R.layout.activity_main);
}
}
歡迎界面WelcomeView.java
package com.nuist.welcomeview;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class WelcomeView extends SurfaceView implements SurfaceHolder.Callback{
private static final String DEBUGTAG = "DebugTag";
MainActivity mainActivity;
/**
* 繪圖需要的一些工具
*/
Paint paint;
int currentAlpha = 0; //當前的不透明值
int screenWith = 320;//當前屏幕的寬度
int screenHeight = 480;//當前屏幕的高度
int sleepSpan = 50; //動畫延遲時間爲50ms
Bitmap[] logos = new Bitmap[2];//用來放置顯示的兩張圖片
Bitmap currentLogo; //當前顯示的那張圖片
int currentX; //圖片位置
int currentY;
public WelcomeView(MainActivity mainActivity) {
super(mainActivity);
this.mainActivity = mainActivity;
this.getHolder().addCallback(this); //設置生命週期回調接口的實現者
paint = new Paint();//創建畫筆
paint.setAntiAlias(true);//打開抗鋸齒
//加載圖片
logos[0] = BitmapFactory.decodeResource(mainActivity.getResources(), R.drawable.logo1);
logos[1] = BitmapFactory.decodeResource(mainActivity.getResources(), R.drawable.logo2);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
new Thread(){
@Override
public void run() {
// TODO Auto-generated method stub
for(Bitmap bp : logos){
currentLogo = bp;
currentX = screenWith/2 - bp.getWidth()/2;//圖片顯示位置
currentY = screenHeight/2 - bp.getHeight()/2;
Log.v(DEBUGTAG, "currentX: "+currentX +" currentY: "+currentY);
for(int i=255;i>-10;i=i-10){
//動態更改圖片的透明度值並不斷重繪
currentAlpha = i;
if(currentAlpha<0) currentAlpha=0;
SurfaceHolder myholder = WelcomeView.this.getHolder();//獲取回調接口
Canvas canvas = myholder.lockCanvas();//獲取畫布
try{
synchronized(myholder){//同步
onDraw(canvas);//進行繪製繪製
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(canvas != null){//如果當前畫布不爲空
myholder.unlockCanvasAndPost(canvas);//解鎖畫布
}
}
try{
if(i==255){
//若是新圖片,多等待一會
Thread.sleep(1000);
}
Thread.sleep(sleepSpan);
}catch(Exception e){
e.printStackTrace();
}
}
}
mainActivity.hd.sendEmptyMessage(1);//發送消息mes.what爲1,回到主界面
}
}.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
//先將背景繪成黑色
paint.setColor(Color.BLACK);
paint.setAlpha(255);//設置不透明度爲255
canvas.drawRect(0, 0, screenWith, screenHeight, paint);
//貼圖片
if(currentLogo ==null)
return;
paint.setAlpha(currentAlpha);
canvas.drawBitmap(currentLogo, currentX, currentY, paint);
}
}