2013-06-19 2 views
0

Я пишу обычную головоломку. Для удобства я создал пользовательский вид: PuzzleView extends ImageView. Он перегружает onTouchEvent(), поэтому я могу перенести мой View пальцем. Ницца.Форма головоломки для пользовательского вида

Однако у меня есть проблема с размещением этих представлений рядом друг с другом, поэтому они вписываются в себя. Пазлы не квадраты, их форма выглядит следующим образом:

enter image description here

И проблема в том, что эти взгляды должны перекрываться немного, чтобы хорошо выглядеть. Но когда квадраты перекрываются, события касания плохо работают в области пересечения. Если я наивно положить, что головоломки как фон PuzzleView, 4 из них будет выглядеть следующим образом:

enter image description here

Они обладают прозрачностью, так что я мог сжать их, чтобы хорошо выглядеть. Но это не очень хорошая идея из-за сенсорных событий. Если мы коснемся границы, будет затронута головоломка, которая «выше» (в z-index). И, может быть, пользователь хочет подобрать другой, и он не может.

Я немного ознакомился с классом Android Shape. Было бы здорово, если бы у меня была головоломка Shape - тогда я смогу использовать ее в качестве фона моего PuzzleView, и я надеюсь, что MotionEvent придет только тогда, когда я коснусь формы, а не какой-то прямоугольной области вокруг нее.

Вопрос в том, как получить головоломку Shape? В идеале я укажу свое изображение, и оно даст мне Shape, взятый из этого изображения. Если это невозможно (или очень сложно), возможно, мы сможем сделать эту головоломку Shape с Path, но как это сделать? Может быть, слишком сложная форма для использования Path? Может быть, есть более простой способ?

ответ

1

Трудно ответить на все ваши вопросы (они не очень конкретные), так что я просто дам вам свою точку зрения:

Я бы сказал, что андроид встроенные взгляды не являются лучшими для это приложение. Нарисовать непосредственно на View (или SurfaceView), вероятно, лучший выбор, он позволяет легко нарисовать изображение поверх другого. Например, предположим, что ваши фигуры имеют ширину 100, вы можете нарисовать первый при x = 0, а второй - в x = 90, и они будут перекрываться.

Вы можете подумать, что для этого требуется больше работы, но вы, скорее всего, столкнетесь с другими проблемами и проблемами производительности (если у вас есть большие головоломки), если вы придерживаетесь ImageViews.

0

Можете ли вы не просто сделать белую часть изображения прозрачной? Если вы хотите совместить их, у меня возникнет соблазн сохранить представление формы как логического объекта, а не пытаться совместить пиксель за пикселем. Если вы хотите сопоставить пиксель за пикселем, см. Pixel-Perfect Collision Detection Android (вам нужно будет консолидировать растровые координаты и относительное положение представления на экране).

+0

Это прозрачный. Проблема в том, что 'ImageView' - это квадрат. Представьте себе, как вы поместите головоломку в квадрат? Головоломка будет либо обрезана, либо слишком много свободного места на границе. И логика не проблема, я не обнаруживаю столкновения. –

+0

Я бы хотел, чтобы «ImageView» имел форму головоломки. Не квадратный. Затем я могу установить их близко друг к другу, и события касания будут работать отлично. –

Смежные вопросы