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