在Android中,我有一个Path对象,我碰巧知道它定义了一条闭合路径,因此我需要弄清楚路径中是否包含给定点。我所希望的是一些类似的东西
path.contains(int x,int y)
但这似乎并不存在。
我要这样做的特定原因是因为我在屏幕上有一组形状定义为路径,并且我想弄清楚用户单击了哪个形状。如果有更好的方法来解决这一问题,例如使用不同的UI元素,而不是自己“艰难地”进行操作,我愿意提出建议。
如果需要的话,我愿意自己编写算法,但这意味着我猜需要进行不同的研究。
本android.graphics.Path类没有这样的方法。Canvas类确实具有可以设置为路径的剪切区域,无法针对某个点对其进行测试。您可以尝试Canvas.quickReject,针对单点矩形(或1x1Rect)进行测试。我不知道这是否真的会检查路径还是仅检查封闭的矩形。
Region类显然只跟踪包含的矩形。
您可以考虑将每个区域绘制到一个8位的alpha层位图中,并在每个区域中Path填入自己的“颜色”值(确保在中关闭了抗锯齿功能Paint)。这为每个填充有填充路径的索引的路径创建了一种掩码。然后,您可以仅使用像素值作为路径列表的索引。
Bitmap lookup = Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8); //do this so that regions outside any path have a default //path index of 255 lookup.eraseColor(0xFF000000); Canvas canvas = new Canvas(lookup); Paint paint = new Paint(); //these are defaults, you only need them if reusing a Paint paint.setAntiAlias(false); paint.setStyle(Paint.Style.FILL); for(int i=0;i<paths.size();i++) { paint.setColor(i<<24); // use only alpha value for color 0xXX000000 canvas.drawPath(paths.get(i), paint); }
然后查点
int pathIndex = lookup.getPixel(x, y); pathIndex >>>= 24;
如果有未填充的点,请确保检查255(无路径)。