自定义控件之Region区域

构造Region

直接构造

    public Region(Region region)  //复制一个同样的Region变量
    public Region(Rect r)
    public Region(int left, int top, int right, int bottom)

示例:

   private void drawRegion(Canvas canvas, Region rgn, Paint paint) {
        RegionIterator iter = new RegionIterator(rgn);
        Rect r = new Rect();

        while (iter.next(r)) {
            canvas.drawRect(r, paint);
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.RED);
        Region region = new Region(new Rect(50, 50, 200, 100));
        drawRegion(canvas, region, paint);
    }

间接构造

public Region()

set函数:

    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)//根据路径的区域与某区域的交集构造出新的区域

置空

  public void setEmpty() //将原来的区域设置为空,再利用其它set函数重新构造区域

注意调用set系列函数的region是不是有区域值,当调用set系列函数后,原来的区域值就会替换成set系列函数里的区域值

示例:

        Paint paint = new Paint();
        paint.setColor(Color.RED);
        paint.setStyle(Paint.Style.FILL);
        //构造一个椭圆路径
        Path ovalPath = new Path();
        RectF rect = new RectF(50, 50, 200, 500);
        ovalPath.addOval(rect, Path.Direction.CCW);
        //SetPath时,传入一个比椭圆区域小的矩形区域,让其取交集
        Region rgn = new Region();
        rgn.setPath(ovalPath, new Region(50, 50, 200, 200));
        //画出路径
        drawRegion(canvas, rgn, paint);

枚举区域-RegionIterator 类

    public RegionIterator(Region region) 构造函数
    public final boolean next(Rect r)获取下一个矩形
    protected void finalize() throws Throwable 

在Canvas中没有直接绘制Region函数,要绘制一个区域,只能通过该类构造矩形来逼近显示区域

   private void drawRegion(Canvas canvas, Region rgn, Paint paint) {
        RegionIterator iter = new RegionIterator(rgn);
        Rect r = new Rect();

        while (iter.next(r)) {
            canvas.drawRect(r, paint);
        }
    }

区域相交

boolean nuion(Rect r)函数用于与指定的矩形取并集

区域操作

    public boolean op(Rect r, Region.Op op)
    public boolean op(int left, int top, int right, int bottom, Region.Op op)
    public boolean op(Region region, Region.Op op)
    public boolean op(Rect rect, Region region, Region.Op op)
    public boolean op(Region region1, Region region2, Region.Op op) 

Op参数值如下

DIFFERENCE  最终区域为region1和region2不同的区域
        INTERSECT  最终区域为region1和region2相交区域
        REPLACE  最终区域为region2的区域
        REVERSE_DIFFERENCE  最终区域为region2和region1不同的区域
        UNION  最终区域为region1和region2组合一起的区域
        XOR  最终区域为region1和region2相交之外的区域

示例代码:

 private void init() {

        //构造两个矩形
        rect1 = new Rect(100,100,400,200);
        rect2 = new Rect(200,0,300,300);

        //构造一个画笔,画出矩形轮廓
        paint = new Paint();
        paint.setColor(Color.RED);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(2);

        //构造两个Region
        region = new Region(rect1);
        region2= new Region(rect2);

        //取两个区域的交集
        region.op(region2, Region.Op. REVERSE_DIFFERENCE);
    }

    private void drawRegion(Canvas canvas, Region rgn, Paint paint) {
        RegionIterator iter = new RegionIterator(rgn);
        Rect r = new Rect();

        while (iter.next(r)) {
            canvas.drawRect(r, paint);
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //画出相交的矩形
        canvas.drawRect(rect1, paint);
        canvas.drawRect(rect2, paint);

        //画面相交的结果
        paint.setColor(Color.GREEN);
        paint.setStyle(Paint.Style.FILL);
        drawRegion(canvas, region, paint);
    }

改变Op参数对比

DIFFERENCE

INTERSECT

REPLACE

REVERSE_DIFFERENCE

UNION

XOR

其他函数

判断方法:

 boolean isEmpty();  判断该区域是否为空
 boolean isRect();判断该区域是否是一个矩阵
 boolean isComplex();判断该区域是否是多个矩阵的组合

getBound系列函数

用于返回一个Region边界,用于返回能够包裹当前路径的最小矩形

 public Rect getBounds()
 public boolean getBounds(Rect r)

用于返回当前矩形所对应的Path对象

 public Path getBoundaryPath()
 public boolean getBoundaryPath(Path path) 

是否包含

public native boolean contains(int var1, int var2);
public boolean quickContains(Rect r)
public native boolean quickContains(int var1, int var2, int var3, int var4);

是否相交

 public boolean quickReject(Rect r)
     public native boolean quickReject(int var1, int var2, int var3, int var4);
    public native boolean quickReject(Region var1);

平移变换

public void translate(int dx, int dy)
public native void translate(int var1, int var2, Region var3);

原文地址:https://www.cnblogs.com/loaderman/p/10191190.html

时间: 2024-08-07 07:04:52

自定义控件之Region区域的相关文章

Halcon学习之六:获取Image图像中Region区域的特征参数

area_center_gray ( Regions, Image : : : Area, Row, Column )    计算Image图像中Region区域的面积Area和重心(Row,Column). cooc_feature_image ( Regions, Image : : LdGray, Direction : Energy,Correlation, Homogeneity, Contrast )   计算共生矩阵和推导出灰度特征值 Direction:灰度共生矩阵计算的方向  

Qt编写自定义控件47-面板区域控件

一.前言 在很多web网页上,经常可以看到一个设备对应一个面板,或者某种同等类型的信息全部放在一个面板上,该面板还可以拖来拖去的,这个控件首次用在智能访客管理平台中,比如身份证信息一个面板,访客信息一个面板,被访人信息一个面板,这样相当于分类展示了,还提供了对应的标题栏有文字显示,这个控件的使用场景也是非常多,还有个子标题可以设置,拓展了报警闪烁的接口. 二.实现的功能 1:支持所有widget子类对象,自动产生滚动条 2:支持自动拉伸自动填充 3:提供接口获取容器内的所有对象的指针 4:可设置

Halcon算子--区域特征

当我们想要提取Region时,图像处理后,往往存在几个类似的Region,此时,需要根据Region的一些特殊特征,来选择指定的Region. 求Region指定特征值:region_features(Regions : : Features : Value) 根据特征值选择区域:select_shape(Regions : SelectedRegions : Features, Operation, Min, Max : ) Region特征一览: 特征 英 译 备注 area Area of

ios 定位 监听是否跨入某个指定的区域

/*****监听用户是否进入和走出 在某个区域*****/ 1 #import "ViewController.h" 2 #import <CoreLocation/CoreLocation.h> 3 4 5 @interface ViewController ()<CLLocationManagerDelegate> 6 7 /** */ 8 @property (nonatomic, strong) CLLocationManager *locationM;

【读书笔记《Android游戏编程之从零开始》】15.游戏开发基础(剪切区域)

剪切区域也称为可视区域,是由画布进行设置的:它指的是在画布上设置一块区域,当画布一旦设置了可视区域,那么除此区域外,绘制的任何内容都将看不到:可视区域可以是圆形.矩形等等. 画布提供了三种设置可视区域的方法. 1.通过坐标,设置矩形可视区域clipRect(int left,int top,int right,int bottom)作用:为画布设置矩形可视区域第一.二个参数:为可视区域的左上角第三.四个参数:为可视区域的右下角 2.利用 Path 来设置可视区域的形状clipPath(Path

Android Path, Region, Paint, Canvas API篇

从这篇文章开始,准备学习Android Canvas相关的一些知识点,因为Canvas使用的时候还经常要用到Path,Region,Paint.所以这里我们先熟悉Path,Region,Paint,Canvas常用的一些API,为后续的学习做好准备. 在列出Path,Region,Paint,Canvas这些API之前先展示一个具体的实例.一个仪表盘.主要用到的是Canvas的API,和一些三角函数的运算.具体效果图如下 仪表盘分成了三段(2:1:2),每一段显示不同的颜色.刻度分成8大份每小份

Android翻页效果原理实现之曲线的实现

尊重原创转载请注明:From AigeStudio(http://blog.csdn.net/aigestudio)Power by Aige 侵权必究! 炮兵镇楼 上一节我们通过引入折线实现了页面的折叠翻转效果,有了前面两节的基础呢其实曲线的实现可以变得非常简单,为什么这么说呢?因为曲线无非就是在折线的基础上对Path加入了曲线的实现,进而只是影响了我们的Region区域,而其他的什么事件啊.滑动计算啊之类的几乎都是不变的对吧,说白了就是对现有的折线View进行update改造,虽然是改造,但

JVM那些事儿(二)——垃圾回收

这节小汪介绍一下jvm的垃圾回收机制,首先我们先提问: 1.为什么要有不同的垃圾算法 2.垃圾回收器要解决的终极目的是什么 3.小汪该如何选择自己的垃圾回收器 一.垃圾回收算法 众所周知,java堆内存的垃圾回收由java虚拟机管理,目前java有几种算法用来解决垃圾回收(以下只介绍最重要的两个算法) 1.1 复制算法 如图所示,复制算法可以说是最直观最简洁的算法了.按照复制算法的思路,内存要分为两块 Eden Survivor区域,Eden有一个,Survivor有两个. 首先,各种对象都在E

[EA]入门教程

一.简介 生命周期软件设计方案--Enterprise Architect是以目标为导向的软件系统.它覆盖了系统开发的整个周期,除了开发类模型之外,还包括事务进程分析,使用案例需求,动态模型,组件和布局,系统管理,非功能需求,用户界面设计,测试和维护等.为整个团队提供高级的UML 2.0建模工具. EA为用户提供一个高性能.直观的工作界面,联合UML 2.0最新规范,为桌面电脑工作人员.开发和应用团队打造先进的软件建模方案.该产品不仅特性丰富,而且性价比极高,可以用来配备您的整个工作团队,包括分