入门笔记之SurfaceView 使用
一、首先介绍几个类
1、SurfaceHolder
这里用到了一个类SurfaceHolder,可以把它当成surface的控制器,用来操纵surface。处理Canvas上的效果和动画,控制表面,大小。
2、 SurfaceHolder.Callback
实现surfaceView的回调函数,三个函数看名字也知道是什么意思。
3、Canvas
理解为画布,就是你要使用canvas 把你想表现的东西画出来。
二、代码逻辑过程
-->继承SurfaceView并实现SurfaceHolder.Callback 接口
--> SurfaceView.getHolder()获得SurfaceHolder 对象
-->SurfaceHolder.addCallback(callback) 添加回调函数
-->SurfaceHolder.lockCanvas()获得Canvas 对象并锁定画布
--> Canvas 绘画
-->SurfaceHolder.unlockCanvasAndPost(Canvas canvas) 结束锁定,并提交改变,将图形显示。
需要说明一点的是,SurfaceHolder.lockCanvas() /SurfaceHolder.lockCanvas(Rect dirty),支持区域重画,也就是说你可以之修改画面的一部分。(ok,其实L没有亲自尝试具体效果)
三、具体代码示例
package com.game; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.SurfaceHolder; import android.view.MotionEvent; import android.view.SurfaceHolder.Callback; import android.view.SurfaceView; import android.view.View; public class GameView extends SurfaceView implements Callback { SurfaceHolder mHolder; Ball mBall; private GameThread mThread ; public GameView(Context context) { super(context); mHolder = getHolder(); mThread = new GameThread(mHolder); mHolder.addCallback(this); setFocusable(true); mBall = new Ball(context); } @Override protected void onDraw(Canvas canvas) { } @Override public boolean onTouchEvent(MotionEvent event) { switch(event.getAction()){ case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: break; } mBall.getUp(); return super.onTouchEvent(event); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) { } @Override public void surfaceCreated(SurfaceHolder holder) { mThread.start(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { mThread.runable = false; } class GameThread extends Thread{ public boolean runable = true ; private SurfaceHolder holder; public GameThread(SurfaceHolder holder){ this.holder = holder; } @Override public void run() { super.run(); while(runable){ synchronized (holder){ System.out.println("ondrawing "); Canvas cv = holder.lockCanvas(); cv.drawColor(Color.BLACK); mBall.ondraw(cv); holder.unlockCanvasAndPost(cv); } try{ Thread.sleep(100); }catch(Exception e){ e.printStackTrace(); }finally{ } } } @Override public synchronized void start() { super.start(); } } }
就是通过一个线程去不断地修改图片的位置,在surfacecreated里面 start()!完整例子随后会给出地址!