В Android у меня есть Объект контуров, который я, оказывается, знаю, определяет замкнутый путь, и я должен выяснить, содержится ли данная точка в пути. То, на что я надеялся, было чем-то вроде
path.contains (интервал x, интервал y)
но это, кажется, не существует.
Определенная причина я ищу это, состоит в том, потому что у меня есть набор форм на экране, определенном как пути, и я хочу выяснить, на какой пользователь нажал. Если существует лучший способ приблизиться к этому, такому как использование различных элементов UI вместо того, чтобы делать его "твердый путь" самостоятельно, я открыт для предложений.
Я открыт для записи алгоритма сам, если я имею к, но это означает другое исследование, которое я предполагаю.
Класс android.graphics.Path
не имеет такого метода. У класса Canvas есть область отсечения, которая может быть установлена на путь, нет возможности проверить ее относительно точки. Вы можете попробовать Canvas.quickReject, протестировав одноточечный прямоугольник (или 1x1 Rect
). Я не знаю, действительно ли это будет проверять путь или только ограничивающий прямоугольник.
Очевидно, что класс Region отслеживает только содержащий его прямоугольник.
Вы можете рассмотреть возможность рисования каждой из ваших областей в 8-битном растровом изображении альфа-слоя с каждым Path
, заполненным собственным значением «цвета» (убедитесь, что сглаживание отключено в вашем Краска
). Это создает своего рода маску для каждого пути, заполненного индексом пути, который его заполнил. Тогда вы можете просто использовать значение пикселя в качестве индекса в вашем списке путей.
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 (нет пути), если есть незаполненные точки.
Вот что я сделал и, кажется, это работает:
RectF rectF = new RectF();
path.computeBounds(rectF, true);
region = new Region();
region.setPath(path, new Region((int) rectF.left, (int) rectF.top, (int) rectF.right, (int) rectF.bottom));
Теперь вы можете использовать метод region.contains(x,y)
.
Point point = new Point();
mapView.getProjection().toPixels(geoPoint, point);
if (region.contains(point.x, point.y)) {
// Within the path.
}
** Обновление от 6/7/2010 **. Метод region.setPath приводит к аварийному завершению работы моего приложения (без предупреждающего сообщения), если rectF слишком велик. Вот мое решение:
// Get the screen rect. If this intersects with the path's rect
// then lets display this zone. The rectF will become the
// intersection of the two rects. This will decrease the size therefor no more crashes.
Rect drawableRect = new Rect();
mapView.getDrawingRect(drawableRect);
if (rectF.intersects(drawableRect.left, drawableRect.top, drawableRect.right, drawableRect.bottom)) {
// ... Display Zone.
}