android Graphics(三):区域(Range)

举个小例子,来说明一个Set系列函数的替换概念:

关于重写新建一个类,并派生自view,并且要重写OnDraw函数的问题我就不再讲了,有问题的同学,可以参考下《android Graphics(一):概述及基本几何图形绘制》,当然最后我也会给出相关的源码,直接看源码也行。

下面写了一个函数,先把Set函数注释起来,看看画出来的区域的位置,然后开启Set函数,然后再看画出来的区域注:里面有个函数drawRegion(Canvas canvas,Region rgn,Paint paint),只知道它可以画出指定的区域就可以了,具体里面是什么意思,后面我们再仔细讲。

public class MyRegionView extends View {public MyRegionView(Context context) {super(context);// TODO Auto-generated constructor stub}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.onDraw(canvas);//初始化画笔Paint paint = new Paint();paint.setColor(Color.RED);paint.setStyle(Style.FILL);paint.setStrokeWidth(2);Region rgn = new Region(10,10,100,100);//rgn.set(100, 100, 200, 200);drawRegion(canvas, rgn, paint);}//这个函数不懂没关系,下面会细讲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);} }}看下效果: 未开启Set函数时

使用Set函数后,替换为新区域

3、使用SetPath()构造不规则区域

boolean setPath (Path path, Region clip)

参数说明:Path path:用来构造的区域的路径Region clip:与前面的path所构成的路径取交集,并将两交集设置为最终的区域

由于路径有很多种构造方法,而且可以轻意构造出非矩形的路径,这就摆脱了前面的构造函数只能构造矩形区域的限制。但这里有个问题是要指定另一个区域来取共同的交集,当然如果想显示路径构造的区域,Region clip参数可以传一个比Path范围大的多的区域,取完交集之后,当然是Path参数所对应的区域喽。机智的孩子。

下面,先构造一个椭圆路径,然后在SetPath时,传进去一个比Path小的矩形区域,让它们两个取交集

public class MyRegionView extends View {public MyRegionView(Context context) {super(context);// TODO Auto-generated constructor stub}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.onDraw(canvas);//初始化PaintPaint paint = new Paint();paint.setColor(Color.RED);paint.setStyle(Style.FILL);paint.setStrokeWidth(2);//构造一个椭圆路径Path ovalPath = new Path();RectF rect = new RectF(50, 50, 200, 500);ovalPath.addOval(rect, Direction.CCW);//SetPath时,传入一个比椭圆区域小的矩形区域,让其取交集Region rgn = new Region();rgn.setPath(ovalPath,new Region(50, 50, 200, 200));//画出路径drawRegion(canvas, rgn, paint);}//这个函数不懂没关系,下面会细讲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);} }}结果如下:

二、矩形集枚举区域——RegionIterator类

对于特定的区域,我们都可以使用多个矩形来表示其大致形状。事实上,如果矩形足够小,一定数量的矩形就能够精确表示区域的形状,也就是说,一定数量的矩形所合成的形状,,也可以代表区域的形状。RegionIterator类,实现了获取组成区域的矩形集的功能,其实RegionIterator类非常简单,总共就两个函数,一个构造函数和一个获取下一个矩形的函数;RegionIterator(Region region) //根据区域构建对应的矩形集booleannext(Rect r) //获取下一个矩形,结果保存在参数Rect r 中

由于在Canvas中没有直接绘制Region的函数,我们想要绘制一个区域,就只能通过利用RegionIterator构造矩形集来逼近的显示区域。用法如下:

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);} }上面我们也都看到了它的用法,首先,根据区域构建一个矩形集,然后利用next(Rect r)来逐个获取所有矩形,绘制出来,最终得到的就是整个区域,如果我们将上面的画笔Style从FILL改为STROKE,重新绘制椭圆路径,会看得更清楚。打破原先的记录,生活没有预赛,要想登上它的领奖台,

android Graphics(三):区域(Range)

相关文章:

你感兴趣的文章:

标签云: