【读书笔记《Android游戏编程之从零开始》】15.游戏开发基础(剪切区域)
剪切区域也称为可视区域,是由画布进行设置的;它指的是在画布上设置一块区域,当画布一旦设置了可视区域,那么除此区域外,绘制的任何内容都将看不到;可视区域可以是圆形、矩形等等。
画布提供了三种设置可视区域的方法。
1.通过坐标,设置矩形可视区域
clipRect(int left,int top,int right,int bottom)
作用:为画布设置矩形可视区域
第一、二个参数:为可视区域的左上角
第三、四个参数:为可视区域的右下角
2.利用 Path 来设置可视区域的形状
clipPath(Path path)
作用:为画布设置可视区域
参数:Path实例
3.利用 Region 来对画布设置可视区域
clipRegion(Region region)
作用:为画布设置可视区域
参数:Region 实例
Region 表示区域的集合,所以它可以设置多个区域块,而且可以通过这些区域块之间的关系来处理一些问题;比如 Region 设置它所有区域块相交的区域是否可见、设置相交区域只让交集显示等等。
Region 常用函数:
op(Rect rect,Op op)
作用:设置区域块
第一个参数:Rect 实例
第二个参数:Region.Op 静态值,表示区域块的显示方式。其中区域块的显示方式如下:
Region.Op.UNION: 区域全部显示
Region.Op.INTERSECT:区域的交集显示
Region.Op.XOR:不显示交集区域
下面是实例演示,效果图如下:

创建新项目,游戏框架为 SurfaceView 游戏框架。具体步骤参照“11.游戏开发基础(SurfaceView 游戏框架、View 和 SurfaceView 的区别)”。
修改 MySurfaceView 类中的绘图函数如下:
    private void myDraw() {
        try {
            canvas = sfh.lockCanvas();
            if (canvas != null) {
                //通过图片资源生成一张Bitmap 位图
                Bitmap bmp = BitmapFactory.decodeResource(this.getResources(), R.drawable.pic01);
                canvas.save();
                canvas.drawText("原图:", 20, 20, paint);
                canvas.drawBitmap(bmp, 20, 30,paint);
                canvas.restore();
                canvas.save();
                canvas.drawText("通过坐标,设置矩形可视区域:", 20, 320, paint);
                /**
                 * 为画布设置矩形可视区域
                 * 第一、二个参数为可视区域的左上角
                 * 第三、四个参数为可视区域的右下角
                 */
                canvas.clipRect(20,330,bmp.getWidth()+20,bmp.getHeight()/2+330);
                canvas.drawBitmap(bmp, 20, 330,paint);
                canvas.restore();
                canvas.save();
                canvas.drawText("利用 Path 来设置可视区域的形状,这里为圆形可视区域:", 20, 620, paint);
                Path path = new Path();
                path.addCircle(20+bmp.getWidth()/2, 630+bmp.getHeight()/2, bmp.getWidth()/2, Direction.CCW);
                /**
                 * 为画布设置可视区域
                 * 参数:Path实例
                 * 利用Paht 可以为位图设置任何需要的可视区域,这里是设置一个圆形可视区域。
                 */
                canvas.clipPath(path);
                canvas.drawBitmap(bmp, 20, 630, paint);
                canvas.restore();
                canvas.save();
                canvas.drawText("利用 Region 来对画布设置可视区域:", 20, 920, paint);
                Region region = new Region();
                //区域块全部显示
                region.op(new Rect(20,930,120,1030), Region.Op.UNION);
                //不显示交集区域
                region.op(new Rect(50,930,100,1080), Region.Op.XOR);
                canvas.clipRegion(region);
                canvas.drawBitmap(bmp, 20, 930, paint);
                canvas.restore();
                }
        } catch (Exception e) {
        } finally {
            if (canvas != null) {
                sfh.unlockCanvasAndPost(canvas);
            }
        }
    }
【读书笔记《Android游戏编程之从零开始》】15.游戏开发基础(剪切区域)的更多相关文章
- Windows游戏编程之从零开始d
		
Windows游戏编程之从零开始d I'm back~~恩,几个月不见,大家还好吗? 这段时间真的好多童鞋在博客里留言说或者发邮件说浅墨你回来继续更新博客吧. woxiangnifrr童鞋说每天都在来 ...
 - Java并发编程的艺术读书笔记(2)-并发编程模型
		
title: Java并发编程的艺术读书笔记(2)-并发编程模型 date: 2017-05-05 23:37:20 tags: ['多线程','并发'] categories: 读书笔记 --- 1 ...
 - Java并发编程的艺术读书笔记(1)-并发编程的挑战
		
title: Java并发编程的艺术读书笔记(1)-并发编程的挑战 date: 2017-05-03 23:28:45 tags: ['多线程','并发'] categories: 读书笔记 --- ...
 - 读书笔记--Android Gradle权威指南(下)
		
前言 最近看了一本书<Android Gradle 权威指南>,收获挺多,就想着来记录一些读书笔记,方便后续查阅. 本篇内容是基于上一篇:读书笔记--Android Gradle权威指南( ...
 - 《Essential C++》读书笔记 之 C++编程基础
		
<Essential C++>读书笔记 之 C++编程基础 2014-07-03 1.1 如何撰写C++程序 头文件 命名空间 1.2 对象的定义与初始化 1.3 撰写表达式 运算符的优先 ...
 - 【读书笔记《Android游戏编程之从零开始》】18.游戏开发基础(碰撞检测)
		
1.矩形碰撞 所谓矩形碰撞,就是利用两个矩形之间的位置关系来进行判断,如果矩形的像素在另外一个矩形之中,或者之上都可以认为这两个矩形发生了碰撞. 如果单纯的去考虑哪些情况会判定两个矩形发生碰撞,倒不如 ...
 - 【读书笔记《Android游戏编程之从零开始》】19.游戏开发基础(游戏音乐与音效)
		
在一款游戏中,除了华丽的界面 UI 直接吸引玩家外,另外重要的就是游戏的背景音乐与音效:合适的背景音乐以及精彩的音效搭配会令整个游戏上升一个档次. 在 Android 中.常用于播放游戏背景音乐的类是 ...
 - 【读书笔记《Android游戏编程之从零开始》】12.游戏开发基础(Canvas 画布)
		
1.Canvas 画布 画布类 Canvas 封装了图形和图片绘制等内容,此类常用的函数说明如下: drawColor(int color) 作用:绘制颜色覆盖画布,常用于刷屏 参数:颜色值,也可用十 ...
 - 【读书笔记《Android游戏编程之从零开始》】16.游戏开发基础(动画)
		
1. Animation动画 在Android 中,系统提供了动画类 Animation ,其中又分为四种动画效果: ● AlphaAnimation:透明度渐变动画 ● ScaleAnimati ...
 
随机推荐
- PUT 还是 POST ?
			
http://www.oschina.net/translate/put-or-post http://my.oschina.net/u/1263964/blog/268932 这两个方法咋一看都可以 ...
 - 设计模式总结篇系列:命令模式(Command)
			
在程序设计中,经常会遇到一个对象需要调用另外一个对象的某个方法以达到某种目的,在此场景中,存在两个角色:请求发出者和请求接收者.发出者发出请求,接收者接收请求并进行相应处理.有时候,当需要对请求发出者 ...
 - playframework中多附件上传注意事项
			
playframework中多附件上传注意事项 2013年09月24日 play 暂无评论 //play版本问题 经确认,1.0.3.2版本下控制器中方法参数 List<File> fi ...
 - IOS6学习笔记(三)
			
1.ARC空声明变量 使用ARC的另一个优势是所有未初始化的变量默认都是“空值化”的.这意味着像下面这样的声明使用ARC编译后指向的是空值(nil): NSObject *myObject1,*myO ...
 - javascript宿主对象之window.frames
			
window.frames属性是当前页面所有框架的集合.要注意的事,这里并没有frame和iframe做出区分.而且,无论页面存不存在框架,window.frames属性总是存在的,并总是指向wind ...
 - JavaScript Array(数组)对象
			
一,定义数组 数组对象用来在单独的变量名中存储一系列的值. 创建 Array 对象的语法: new Array(); new Array(size); new Array(element0, elem ...
 - 读书笔记2014第6本:《The Hunger Games》
			
以前从未读过一本完整的英文小说,所有就在今年的读书目标中增加了一本英文小说,但在头四个月内一直没有下定决定读哪一本.一次偶然从SUN的QQ空间中看到Mockingjay,说是不错的英文小说,好像已经是 ...
 - Swift开发第六篇——操作运算符也可以重载& func 的参数修饰
			
本篇分为两部分: 1.Swift 中重载操作运算符的使用 2.Swfit 中 func 的参数修饰 1.Swift 中重载操作运算符的使用 与别的语言不同,Swift 支持运算符的重载,运算符指的是“ ...
 - C语言-10-位域与共用体
			
位域 在某种特定情况下,一个结构体中的多个变量只使用各自存储空间的几位,而其他位从来不使用.这种情况下,可以使用位域来限定每个变量的用来存储数据的位宽. 作用 限定结构体中变量用来存放数据的位宽,即使 ...
 - 那些Xcode不能错过的插件
			
转载来自网络 古人云“工欲善其事必先利其器”,打造一个强大的开发环境,是立即提升自身战斗力的绝佳途径!以下是搜集的一些有力的XCode插件. 1.全能搜索家CodePilot 2.0 你要找的 ...