代码地址如下:
http://www.demodashi.com/demo/14799.html

前言

Region,即为区域,它表示的是canvas图层上的某一块封闭的区域。很多时候,我们会利用Region来构造一个图形。

今天要讲的内容有:

  1. Region的直接构造方法
  2. Region的间接构造方法
  3. Region的setPath(Path path, Region clip)方法介绍
  4. Region取区域并集
  5. Region.Op常量操作Region
  6. 项目结构图和效果图
一. Region的直接构造方法

Region有以下构造方法:

public Region(Region region);//复制一个Region
public Region(Rect r);//通过Rect构建一个Region
public Region(int left, int top, int right, int bottom);//通过坐标点构建一个region

下面我们试图绘制一个Region,代码如下:

        //设置画笔
Paint paint=new Paint();
paint.setColor(getRidColor(R.color.color_0a900a));
paint.setStyle(Paint.Style.FILL);
paint.setStrokeWidth(5f);//无描边,设置setStrokeWidth无效 //构建矩形
Rect rect=new Rect();
rect.set(340,50,740,250);
Region region=new Region(rect); //Android还提供了一个RegionIterator来对Region中的所有矩阵进行迭代,
// 可以使用该类,获得某个Region的所有矩阵
//通过遍历region中的矩阵,并绘制出来,来绘制region
RegionIterator iterator=new RegionIterator(region);
Rect r=new Rect();
while(iterator.next(r)){
canvas.drawRect(r,paint);
}

以上代码值得注意的是,Paint设置的style是FILL,不存在描边的问题,所有设置 stokenWidth无效。

RegionIterator 是Region中所有矩阵的迭代器,我们可以通过遍历region中的矩阵,并绘制出来,来绘制region。

绘制出的Region效果图如下:

由上面的代码可以看出来,Canvas并未提供直接绘制Region的方法,而Region的本意也不是用来绘图的。它的主要作用是来操作图形的,用处理区域间的合并,差集等逻辑关系

二. Region的间接构造方法

Region的间接构造方法主要是通过new一个空的Region,然后结合set相关函数来设置Region。

Region空构造函数:

public Region();

涉及的set函数有:

public void setEmpty();//设置空
public boolean set(Region region);
public boolean set(Rect r);
public boolean set(int left, int top, int right, int bottom);
public boolean setPath(Path path, Region clip);

那么要构建一个Region的话,你可以这样:

Region region=new Region();
region.set(340,50,740,250);

值得注意的是,setXXX系列的方法,都会替换掉之前Region中的区域值。

setEmpty()方法是清空Region中的区域。

其他几个方法都好理解,下面着重讲 setPath 方法。

三. Region的setPath(Path path, Region clip)方法介绍
public boolean setPath(Path path, Region clip);

参数介绍:

Path path:用来构造区域的路径

Region clip:与第一个参数path所构成的路径取交集,并将该交集设为最终区域。

简单的说,就是setPath(Path path, Region clip)方法是将path形成的路径和clip形成的区域取交集,获得一个交集区域。

下面给出setPath方法使用的代码:

        //设置paint
Paint paint=new Paint();
paint.setColor(getRidColor(R.color.color_f5cc1d));
paint.setStyle(Paint.Style.FILL);
//构造椭圆路径
Path path=new Path();
//构建椭圆path
RectF rectF=new RectF(100,300,980,500);
path.addOval(rectF,Path.Direction.CCW);//Path.Direction.CCW:逆时针;Path.Direction.CW:顺时针
//构建Region
Region region=new Region();
region.set(540,300,980,500);
//取path和region的交集
Region rgn=new Region();
rgn.setPath(path,region);
//绘制区域
drawRegion(canvas,rgn,paint);

效果图如下:

四. Region取区域并集

Region取区域并集的方法如下:

boolean union(Rect r);

返回的是一个boolean,若为true,则表示并集成功,否则表示失败

示例代码如下:

        //设置画笔
Paint paint=new Paint();
paint.setColor(getRidColor(R.color.color_12aef7));
paint.setStyle(Paint.Style.FILL);
//设置区域
Region region=new Region(540,550,980,650);
region.union(new Rect(490,600,590,700));
//绘制区域
drawRegion(canvas,region,paint);

效果图如下:

五.Region.Op常量操作Region

当然,region的操作还有多种,简便的操作,由Region.Op常量控制

Region.Op操作常量有:

Region.Op.INTERSECT  //交集
Region.Op.DIFFERENCE //补集
Region.Op.REPLACE //替换
Region.Op.REVERSE_DIFFERENCE //反转补集
Region.Op.UNION //并集
Region.Op.XOR //异并集

下面给出Region操作交集的示例代码:

        Paint paint=new Paint();
paint.setColor(Color.BLUE);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(5);
//绘制矩形轨迹
Rect rOne=new Rect(120,750,220,1050);
Rect rTwo=new Rect(20,850,320,950);
canvas.drawRect(rOne,paint);
canvas.drawRect(rTwo,paint); Region regionOne=new Region(rOne);
Region regionTwo=new Region(rTwo);
regionTwo.op(regionOne,Region.Op.INTERSECT);//交集
paint.setStyle(Paint.Style.FILL);
drawRegion(canvas,regionTwo,paint);

效果图如下:

其他几种Region操作情况与此类似,demo中均有详细代码,现在给出自定义控件RegionView的主要逻辑代码:

        //初始化
init(canvas);
//直接构建Region
directbuildRegion(canvas);
//间接构建Region
inDirectBuildRegion(canvas);
//Region的setPath方法求path和region的交集
pathAndRegionIntersection(canvas);
//区域取并集
rectAndRectIntersection(canvas); //区域操作
controOne(canvas);//交集
controTwo(canvas);//补集
controThree(canvas);//替换
controFour(canvas);//反转补集
controFive(canvas);//并集
controSix(canvas);//异并集

RegionView在MainActivity对应的activity_main.xml中引用如下:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.android.testdemo.main.MainActivity"> <com.android.testdemo.function.RegionView
android:layout_width="match_parent"
android:layout_height="match_parent" /> </android.support.constraint.ConstraintLayout>
六.项目结构图和效果图

项目结构图

效果图

Region使用全解

代码地址如下:
http://www.demodashi.com/demo/14799.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

Region使用全解的更多相关文章

  1. 第48章 MDK的编译过程及文件类型全解—零死角玩转STM32-F429系列

    第48章     MDK的编译过程及文件类型全解 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...

  2. 易全解token获取

    //易全解app             string strClientID = "2016061711434943493606";             string str ...

  3. IOS-UITextField-全解

    IOS-UITextField-全解   //初始化textfield并设置位置及大小   UITextField *text = [[UITextField alloc]initWithFrame: ...

  4. 什么是JavaScript闭包终极全解之一——基础概念

    本文转自:http://www.cnblogs.com/richaaaard/p/4755021.html 什么是JavaScript闭包终极全解之一——基础概念 “闭包是JavaScript的一大谜 ...

  5. Sql Server函数全解<五>之系统函数

    原文:Sql Server函数全解<五>之系统函数  系统信息包括当前使用的数据库名称,主机名,系统错误消息以及用户名称等内容.使用SQL SERVER中的系统函数可以在需要的时候获取这些 ...

  6. Sql Server函数全解<四>日期和时间函数

    原文:Sql Server函数全解<四>日期和时间函数   日期和时间函数主要用来处理日期和时间值,本篇主要介绍各种日期和时间函数的功能和用法,一般的日期函数除了使用date类型的参数外, ...

  7. 九度oj题目&amp;吉大考研11年机试题全解

    九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

  8. js系列教程2-对象、构造函数、对象属性全解

    全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...

  9. js系列教程1-数组操作全解

    全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...

随机推荐

  1. IIS 7.0 SSL 部署指南

    一.  生成证书请求 1.进入IIS控制台    进入IIS控制台,并选择服务器的服务器证书设置选项.  2.添加证书请求    进入服务器证书配置页面,并选择“创建证书申请”  3.选择加密服务提供 ...

  2. ZMQ和MessagePack的简单使用(转)

    近段日子在做一个比较复杂的项目,其中用到了开源软件ZMQ和MessagePack.ZMQ对底层网络通信进行了封装,是一个消息处理队列库, 使用起来非常方便.MessagePack是一个基于二进制的对象 ...

  3. XGBoost浅入浅出

    http://wepon.me/ XGBoost风靡Kaggle.天池.DataCastle.Kesci等国内外数据竞赛平台,是比赛夺冠的必备大杀器.我在之前参加过的一些比赛中,着实领略了其威力,也取 ...

  4. PHP文件操作[总结]

    1.前言 工作中涉及到数据处理,后台需要用到PHP处理数据,之前没有接触过PHP,借此机会了解了一下PHP,PHP很方便,很灵活,编码很舒服,很喜欢用PHP处理后台数据.今天总结一下php文件操作,主 ...

  5. 前端开发必备 40款优秀CSS代码编写工具推荐

    摘要:CSS工具可以简化工作流,可以提高CSS编写速度,是开发者和设计者所不可缺少的.本文列举了40种CSS工具,功能涉及CSS菜单.动画.3D图形.响应式页面.图层.按钮等界面元素的设计与制作,你定 ...

  6. 【math】梯度下降法(梯度下降法,牛顿法,高斯牛顿法,Levenberg-Marquardt算法)

    原文:http://blog.csdn.net/dsbatigol/article/details/12448627 何为梯度? 一般解释: f(x)在x0的梯度:就是f(x)变化最快的方向 举个例子 ...

  7. Syntax error missing ; before *

      [问题] I have a header file like so: #pragma once #include "gamestate.h" #include "Ex ...

  8. CHtmlEditCtrl (2): Add a Source Text Editor to Your HTML Editor

    In a previous article, I described how to create an HTML editor using the MFC CHtmlEditCtrl class in ...

  9. Node.js中 express-session的奇怪问题

      var session = require('express-session');   app.use(cookieParser()); 行 登录以后访问的时候有时候会报这样的错误: The la ...

  10. 当前Azure中国可使用的虚拟机的Size列表

    Standard_A0,Standard_A1,Standard_A2,Standard_A3,Standard_A5,Standard_A4,Standard_A6,Standard_A7, Bas ...