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