首页 > 代码库 > SurfaceView的用法----实现刚进入程序时渐变场景效果

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)
	{//销毁时被调用
		//销毁时激发,一般在这里将画图的线程停止、释放。
	}
}

四、效果图