Из того, что я понимаю, вы говорите, что у вас есть треугольник, нарисованный внутри RelativeLayout
в CustomView
. Фактический размер View
равен FILL_PARENT
как по ширине, так и по высоте. Таким образом, квадрат, представляющий осязаемую область треугольника, совпадает с квадратом, представляющим осязаемую область родителя RelativeLayout
.
Вы хотели бы, чтобы события касания внутри нарисованной области треугольника были получены треугольником View
, а все, что снаружи, было получено родителем. Насколько я понимаю, невозможно определить пользовательскую сенсорную область.
Это не мешает вам манипулировать границами рисования и сенсорным фокусом, чтобы добиться того, что вы хотите.
Как это можно сделать
Убедитесь, что ваш CustomView
с треугольником всегда получает событие касания. Когда он получает событие касания, он выполняет базовые математические операции, чтобы выяснить, было ли касание в пределах области вашего треугольника (у вас должны быть границы треугольника, которые вы используете для рисования треугольника, сохраненные как глобальные переменные для CustomView
).
Затем простой условный оператор, чтобы определить, следует ли действовать и потреблять или передавать событие (вы вообще хотите, чтобы TouchEvent
на вашем RelativeLayout
что-то делало? Если нет, это делает это намного проще).
Пример скелета кода:
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean inTriangle = false;
float x = event.getX();
float y = event.getY();
// This really depends on what behaviour you want, if a drag extends outside the
// triangle bounds, do you want this to end the touch event? This code could be done
// more efficiently depending on your choices / needs
// Do maths to figure out if the point is actually inside the triangle. Once again,
// many solutions and some much easier than others depending on type of triangle
// This flow will only register events in the triangle, and do nothing when outside
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (inTriangle) {
// Do whatever it is you want to do
return true; // to say you consumed the event if necessary
} else {
return false; // parent RelativeLayout should now get touch event
}
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
if (inTriangle) {
// Do whatever it is you want
return true;
} else {
// Do nothing
return true; // So is stil consumed
}
}
return true;
}
Честно говоря, вопрос слишком открытый / неясный, чтобы дать что-то более конкретное. Но именно так вы бы выполнили то, о чем просили. Просто примените его к вашему конкретному сценарию.
Примечание. Я столкнулся с проблемами при передаче TouchEvent
, поэтому, если вы действительно хотите передать их в определенные места, вам, возможно, придется исследовать игру с View.dispatchTouchEvent(), если порядок обработки ваших касаний становится проблемой.
person
btalb
schedule
23.07.2012