使用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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值