从我收集到的你所说的,你在 aRelativeLayout
中画了一个三角形CustomView
。实际View
尺寸FILL_PARENT
适用于宽度和高度。所以表示三角形可触摸区域的正方形与表示父元素可触摸区域的正方形相同RelativeLayout
。
您希望三角形绘制区域内的触摸事件由三角形接收,View
而外部的任何触摸事件都由父级接收。据我了解,无法定义自定义触摸区域。
这不会阻止您操纵绘图边界和触摸焦点来完成您想要的。
怎么做
确保您CustomView
的 triange始终接收到触摸事件。当它接收到触摸事件时,它会执行基本的数学运算来确定触摸是否在您的三角形区域内(您必须将用于绘制三角形的三角形边界保存为 的全局变量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
传递问题,所以如果你真的想把它们传递到特定的地方,如果你的 Touches 被处理的顺序成为问题,你可能不得不调查View.dispatchTouchEvent()的玩弄。