使用Path时候遇到的有些问题

文章目录

  • 零、参考链接:
  • 一、Path多次绘制时携带上一次信息的问题
  • 二、获取两条Path相交的交点

零、参考链接:

  1. Android关于Path你所知道的和不知道的一切
  2. Android自定义View_Path完结篇(学习笔记)

一、Path多次绘制时携带上一次信息的问题

问题描述:在学习http://www.jianshu.com/p/2c19abde958c这个博客的时候,运行其中一个代码片段,发现结果和帖子上描述的不同(注意我把Path定义成全局变量,因为系统提示的)。代码片段如下:

//注意这里的path变量是全局变量
path.lineTo(50, 200);
path.arcTo(new RectF(200, 200, 300, 300), 0, 180);
canvas.drawPath(path, mPaint);

然后和朋友一起研究后发现,onDraw()绘制了两次,在绘制第二次的时候携带了之前的Path信息导致的结果不同,只需要每次绘制之前或之后把Path的信息清空就可以了。后来通过查找ApiDemos发现正确写法是每次调用Path之前调用下Path.reset()就可以了。当然如果Path只绘制一条路径就不需要这样了。

另外多方测试发现只是部分手机有这个问题.

二、获取两条Path相交的交点

这里先看下有问题的写法:

//touchLinePath、baseLinePath是两个Path类型变量
Region intersection = new Region(0, 0, getWidth(), getHeight());
Region region1 = new Region();
region1.setPath(touchLinePath, intersection);
Region region2 = new Region();
region2.setPath(baseLinePath, intersection);
boolean intersected = intersection.set(region1);
intersected = intersection.op(region2, Region.Op.INTERSECT);
Log.i("============value", intersected + "");
if (intersected) {
 RegionIterator iterator = new RegionIterator(intersection);
 Rect rect = new Rect();
 while (iterator.next(rect)) {
  canvas.drawCircle(rect.left, rect.top, dp2px(3.5f), circlePaint2);
  // coords数组中的第一个元素是x坐标,第二个元素是y坐标
  // 这就是交点的坐标
  break;
  }
}

以上写法是使用Region进行获取相交的区域,但是该方式有较大概率获取不到交点。以下是修正后的写法

Path tempPath = new Path();
RectF rectF = new RectF();
boolean isIntersect = tempPath.op(touchLinePath,baseLinePath, Path.Op.INTERSECT);
tempPath.computeBounds(rectF, true);
if (isIntersect) {
  canvas.drawCircle(rectF.left, rectF.top, dp2px(3.5f), circlePaint2);
}

你可能感兴趣的:(View,android)