Android游戏开发基础part5--剪切区域
游戏开发基础part5--剪切区域
剪切区域在游戏开发中也是画布很常用的一个函数,是游戏开发需要重点掌握的知识点。
自己在学习第5章的时候,就体会到剪切的用处。剪切区域呢,也称可视区域,是由画布进行设置的;它指的是在画布上设置一块区域,当画布一旦设置了可视区域,那么除此区域以外,绘制的任何内容都将看不到;这是很有趣的事情,哈哈,哪里有趣,白痴。
新建项目:ClipCanvasProject,还是在SurfaceView游戏框架下进行开发。
剪切区域内容不多,就是一个函数:
clipRect(int left, int top, int right, int bottom)
作用:为画布设置矩形可视区域,(当然还有绘制圆形的函数)
第一、二个参数:可视区域的左上角坐标
第三、四个参数:可视区域的右下角坐标
因为设置可视区域是对整个画布进行操作,所以应该在绘制之前save一下,绘制完后再restore一下。
就是这样:
canvas,save();
canvas.clipRect(0,0,20,20);
canvas.drawRect(0,0,this.getWidth(),this.getHeight(),paint);
canvas.restore();
当然设置可视区域不仅仅只有设置矩形可视区域,画布还提供了其他两种设置可视区域的方法:
1.利用Path来设置可视区域的形状。
clipPath(Path path)
作用:为画布设置可视区域
参数:Path实例
2.利用Region来对画布设置可视区域。
clipRegion(Region region)
作用:为画布设置可视区域
参数:Region实例
Region这个类:表示区域的集合
常用函数:
op(Rect rect,Op op)
作用:设置区域块
第一个参数:Rect实例
第二个参数:Region.Op静态值,表示区域块的显示方式。
显示方式:
Region.Op.UNION:区域全部显示
Region.Op.INTERSECT:区域的交集显示;
Region.Op.XOR:不显示交集区域
实例代码:
==>MySurfaceView.java
package com.clipCanvas; 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.graphics.Rect; import android.graphics.Region; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceHolder.Callback; import android.view.SurfaceView; public class MySurfaceView extends SurfaceView implements Callback,Runnable { //用于控制SurfaceView private SurfaceHolder sfh; //声明一个画笔 private Paint paint; //声明一个线程 private Thread th; //线程消亡的标志位 private boolean flag; //声明一个画布 private Canvas canvas; //声明屏幕的宽高 private int screenW,screenH; //声明一个位图 private Bitmap bmp; /** * SurfaceView * */ public MySurfaceView(Context context){ super(context); //实例SurfaceHolder sfh = this.getHolder(); //为SurfaceView添加状态监听 sfh.addCallback(this); //实例一个画笔 paint = new Paint(); //设置画笔颜色为白色 paint.setColor(Color.WHITE); //设置焦点 setFocusable(true); //生成一张位图 bmp = BitmapFactory.decodeResource(this.getResources(), R.drawable.image); } /** * Surfaceview 视图创建,响应此寒素 * */ @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub screenW = this.getWidth(); screenH = this.getHeight(); flag = true; //实例线程 th = new Thread(this); //启动线程 th.start(); } /** * 游戏绘图 */ public void myDraw(){ try{ canvas = sfh.lockCanvas(); if(canvas != null){ //刷屏 canvas.drawColor(Color.BLACK); canvas.save(); /*canvas.clipRect(0,0,20,20); canvas.drawRect(0, 0, this.getWidth(), this.getHeight(), paint); canvas.drawBitmap(bmp, 0, 0, paint); */ /*----利用Path来设置可视区域的形状 Path path = new Path(); path.addCircle(30, 30, 30, Direction.CCW); canvas.clipPath(path); canvas.drawBitmap(bmp, 30, 30, paint); */ //-----利用Regin来对画布设置可视区域 Region region = new Region(); region.op(new Rect(20,20,100,100), Region.Op.UNION); region.op(new Rect(40,20,80,150), Region.Op.XOR); canvas.clipRegion(region); canvas.drawBitmap(bmp, 0, 0, paint); canvas.restore(); } } catch(Exception e){ }finally{ if(canvas != null) sfh.unlockCanvasAndPost(canvas); } } /** * 触屏事件的监听 */ @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub return true; } /** * 按键事件的监听 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub return super.onKeyDown(keyCode, event); } /** * 游戏逻辑 */ private void logic(){ } @Override public void run() { // TODO Auto-generated method stub while(flag){ long start = System.currentTimeMillis(); myDraw(); logic(); long end = System.currentTimeMillis(); try{ if(end - start < 50){ Thread.sleep(50 - (end - start)); } }catch(InterruptedException e){ e.printStackTrace(); } } } /** * SurfaceView视图状态发生改变,响应此函数 */ @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } /** * SurfaceView视图消亡时,响应此函数 */ @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub flag = false; } }