构造函数 :
Region(region:Region)
Region(rect:Rect)
Region(left:Int, top:Int, right:Int, bottom:Int)
设置区域范围,注意 : set()会覆盖原来的数据
public boolean set(@NonNull Region region)
public boolean set(@NonNull Rect r)
public boolean set(int left, int top, int right, int bottom)
测试代码 :
private val mRegion: Region = Region(Rect(100, 100, 400, 400)).also {
it.set(Rect(100, 500, 400, 800)) // 使用后覆盖原来构造函数传的Rect()值
}
private val mRegionIterator: RegionIterator = RegionIterator(mRegion)
private val mRect: Rect = Rect()
private val mPaint: Paint = Paint().also {
it.color = Color.BLACK
}
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
while (mRegionIterator.next(mRect)) {
canvas.drawRect(mRect, mPaint)
}
}
1618460196(1).png
对一个路径进行区域设置
path : path路径
region : 裁剪的范围(通过设置矩形范围,在矩形范围内的path路径会显示出来,超出部分不显示)
public boolean setPath(@NonNull Path path, @NonNull Region clip)
测试代码 :
private val mPath: Path = Path().also {
it.addCircle(300f, 300f, 200f, Path.Direction.CW)
}
private val mClipRegion: Region = Region().also {
it.set(Rect(100, 100, 500, 300))
}
private val mRegion: Region = Region().also {
it.setPath(mPath, mClipRegion)
}
private val mRegionIterator: RegionIterator = RegionIterator(mRegion)
private val mRect: Rect = Rect()
private val mPaint: Paint = Paint().also {
it.color = Color.BLACK
}
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
while (mRegionIterator.next(mRect)) {
canvas.drawRect(mRect, mPaint)
}
}
1618461073(1).png
为什么在onDraw()中绘制Region区域的时候需要使用RegionIterator
Region 在绘制的时候不是一次性绘制完成,
而是通过一个Rect()(next()中传入的Rect)区域一部分一部分的绘制
测试代码 : 上面path()的代码修改
private val mPaint: Paint = Paint().also {
it.color = Color.BLACK
it.style = Paint.Style.STROKE //不使用填充模式
}
1618461372(1).png
/*
获取path,如果没有设置过path,返回一个空的path
*/
public Path getBoundaryPath()
/*
如果区域包含多个矩形,则返回true
*/
public native boolean isComplex()
例子 :
private val mRegion: Region = Region(Rect(100, 100, 500, 300))
return false //因为这里只有一个矩形,一次性画完
private val mRegion: Region = Region().also {
it.setPath(mPath, mClipRegion)
}
return true //这里是使用多个矩形最后拼接成一个形状,使用Paint.Style.STROKE可以看到
/*
清空 Region
*/
public void setEmpty()
/*
返回Region的范围,如果为空,返回[0,0 - 0,0]
如果是通过path设置,返回的是clipRegion的范围
*/
public boolean getBounds(@NonNull Rect r)
/*
判断某个点或者某个范围是否在Region上
(如果style = Paint.Style.STROKE,那就只有在边上才返回true)
*/
public native boolean contains(int x, int y)
public boolean quickContains(@NonNull Rect r)
public native boolean quickContains(int left, int top, int right, int bottom)
/*
裁剪
*/
public boolean op(@NonNull Rect r, @NonNull Op op)
public boolean op(int left, int top, int right, int bottom, @NonNull Op op)
public boolean op(@NonNull Region region, @NonNull Op op)
public boolean op(@NonNull Rect rect, @NonNull Region region, @NonNull Op op)
public boolean op(@NonNull Region region1, @NonNull Region region2, @NonNull Op op)
测试代码 :
private val mRectSource:Rect = Rect(100, 100, 500, 500)
private val mRectDst: Rect = Rect(60, 60, 300, 300)
private val mRectSourceN:Rect = Rect(100, 800, 500, 1200)
private val mRectDstN: Rect = Rect(60, 760, 300, 1000)
private val mRegion: Region = Region(mRectSourceN).also {
it.op(mRectDstN, Region.Op.REVERSE_DIFFERENCE)
}
private val mRegionIterator: RegionIterator = RegionIterator(mRegion)
private val mRect: Rect = Rect()
private val mPaint: Paint = Paint().also {
it.color = Color.BLACK
}
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
mPaint.color = Color.GREEN
canvas.drawRect(mRectSource, mPaint)
mPaint.color = Color.RED
canvas.drawRect(mRectDst, mPaint)
while (mRegionIterator.next(mRect)) {
canvas.drawRect(mRect, mPaint)
}
}
Region.Op.DIFFERENCE
1618482017(1).png
Region.Op.INTERSECT
1618482132(1).jpg
Region.Op.REVERSE_DIFFERENCE
1618482195(1).jpg
Region.Op.XOR
1618482249(1).jpg
Region.Op.REPLACE
1618482302(1).jpg
Region.Op.UNION
1618482396(1).jpg
网友评论