SurfaceView的用法----實現剛進入程序時漸變場景效果

SurfaceView是View的繼承類,所以也是一個View。我們可以控制Surface的格式和尺寸,並且通過SurfaceHolder接口訪問這個surface,getHolder()方法可以得到這個接口。當surfaceview變得可見時,surface被創建;surfaceview隱藏前,surface被銷燬。

一、實現

首先繼承SurfaceView並實現SurfaceHolder.Callback接口
使用接口的原因:因爲使用SurfaceView 有一個原則,所有的繪圖工作必須得在Surface 被創建之後才能開始(Surface—表面,這個概念在 圖形編程中常常被提到。基本上我們可以把它當作顯存的一個映射,寫入到Surface 的內容 可以被直接複製到顯存從而顯示出來,這使得顯示速度會非常快),而在Surface 被銷燬之前必須結束。所以Callback 中的surfaceCreated 和surfaceDestroyed 就成了繪圖處理代碼的邊界。


如果一個客戶端實現了SurfaceHoder.Callback接口,當surface發生改變時,這個客戶端就可以收到改變信息。通過SurfaceHolder.addCallback這個方法就可以添加這個Callback。

二、整個過程

整個過程:繼承SurfaceView並實現SurfaceHolder.Callback接口 ----> SurfaceView.getHolder()獲得SurfaceHolder對象 ---->SurfaceHolder.addCallback(callback)添加回調函數---->SurfaceHolder.lockCanvas()獲得Canvas對象並鎖定畫布----> Canvas繪畫 ---->SurfaceHolder.unlockCanvasAndPost(Canvas canvas)結束鎖定畫圖,並提交改變,將圖形顯示。

三、例子

public class WelcomeView extends SurfaceView 
implements SurfaceHolder.Callback   //實現生命週期回調接口
{
	MainActivity activity;//activity的引用
	Paint paint;      //畫筆
	int currentAlpha=0;  //當前的不透明值
	int sleepSpan=60;      //動畫的時延ms
	Bitmap currentLogo,logos;  //當前logo圖片引用
	int currentX=40;      //圖片位置
	int currentY=0;
	public WelcomeView(MainActivity activity)
	{
		super(activity);
		this.activity = activity;
		this.getHolder().addCallback(this);  //設置生命週期回調接口的實現者
		paint = new Paint();  //創建畫筆
		paint.setAntiAlias(true);  //打開抗鋸齒
		logos=BitmapFactory.decodeResource(activity.getResources(), R.drawable.mainf);		
	}
	public void onDraw(Canvas canvas)
	{	
		//繪製黑填充矩形清背景
		paint.setColor(Color.BLACK);//設置畫筆顏色
		paint.setAlpha(255);//設置不透明度爲255
		canvas.drawRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, paint);
		//進行平面貼圖
		if(currentLogo==null)return;
		paint.setAlpha(currentAlpha);		
		canvas.drawBitmap(currentLogo, currentX, currentY, paint);	
	}
	public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3)
	{
		 //在surface的大小發生改變時激發
	}
	public void surfaceCreated(SurfaceHolder holder) //創建時被調用	
	{	
		new Thread()
		{
			public void run()
			{
					currentLogo=logos;//當前圖片的引用
					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(10);
							}
							Thread.sleep(sleepSpan);
						}
						catch(Exception e)//拋出異常
						{
							e.printStackTrace();
						}
					
				}
				activity.hd.sendEmptyMessage(0);//發送消息,進入到主菜單界面
			}
		}.start();
	}
	public void surfaceDestroyed(SurfaceHolder arg0)
	{//銷燬時被調用
		//銷燬時激發,一般在這裏將畫圖的線程停止、釋放。
	}
}

四、效果圖


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