现在的位置: 首页 > 综合 > 正文

Android游戏开发基础part5–剪切区域

2014年01月21日 ⁄ 综合 ⁄ 共 3618字 ⁄ 字号 评论关闭

游戏开发基础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;
		
	}
	
}

 

抱歉!评论已关闭.