我的父视图是RelativeLayout,我在其中添加了一个三角形来扩展View类。我用画布和油漆绘制三角形。我面临的问题是,当我触摸相对布局时,触摸听众,相对布局和三角形都被触发。我只是希望三角形能够根据需要采用确切的空间。如何限制我的自定义视图,在这种情况下三角形占用它的空间,而不是占用整个父布局。
其实我的要求是:我在布局上有一个相对布局我动态添加一些自定义视图。那些在三角形中有拖动点的触摸侦听器,但那些是全屏我的父视图,因为我无法单独为父视图和子视图触发触摸侦听器。
我花了无数个小时为这个问题开发解决方案,我无法理解它。任何帮助将不胜感激。
答案 0 :(得分:3)
根据我的收集,你说,你在RelativeLayout
的{{1}}内绘制了一个三角形。宽度和高度的实际CustomView
大小均为View
。因此,表示三角形的可触摸区域的正方形与表示父FILL_PARENT
的可触摸区域的正方形相同。
您希望触摸三角形绘制区域内的事件,以便由三角形RelativeLayout
接收,以及父级接收的任何外部事件。根据我的理解,无法定义自定义触摸区域。
这并不能阻止你操纵绘图边界和触摸焦点来完成你想要的东西。
如何完成
确保您的View
与triange 始终接收触摸事件。当它接收到触摸事件时,它会执行基本数学运算以确定触摸是否在您的三角形区域内(您必须使用三角形边界来绘制保存为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;
次传递的问题,所以如果你真的想将它们传递到特定的地方,你可能需要调查玩弄View.dispatchTouchEvent()您的触摸正在处理的顺序成为一个问题。
答案 1 :(得分:1)
您在处理三角形的触摸事件时遇到问题,因为您正在触摸视图RalativeLayout和您的自定义视图。
要解决此问题,您必须在customview的onTouchEvent中进行一些更改。 喜欢如果您正在触摸自定义视图,如果您想要处理事件,那么从onTouchEvent开始,您将不得不返回 true 而不是false,这样您的父视图就不会获得触摸事件。