實現一個簡單的歡迎界面

一些app在啓動的時候通常會有一個歡迎界面,一直想知道是怎麼樣實現的,所以結合手頭的書籍寫了一個自己的歡迎界面。在歡迎界面中漸變的顯示了兩張圖片。

歡迎界面WelcomeView是繼承了SurfaceView並實現了接口SurfaceHolder.Callback

在MainActivity中有一個handler來處理消息,從而選擇是加載歡迎界面,還是回到MainActivity.

該實例是從《Android應用案例開發大全》第一章中的實例中抽取出來的。

之前之所以不知道歡迎界面如何實現纔好,主要是沒有想到用handler來實現這樣的一個過程。現在有了這樣一個處理的模式,以後爲每個app增加一個歡迎界面都不是難事了。

整個例子的實現步驟如下:

onCreate()發送了一個meg.what0   à  handler去處理調用了goToWelcomeView() à WelcomeView得到了調用  à  在線程執行完後發送一個meg.whatà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);	
	}
}


使用到的兩張圖片資源爲:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章