我的父 View 是一个RelativeLayout,我添加了一个三角形来扩展View类。我使用 Canvas 和颜料绘制三角形。我面临的问题是,当我触摸相对布局时,两个触摸监听器、相对布局和三角形都会被触发。我只希望三角形占据所需的确切空间。在这种情况下,我如何限制我的 customview ,三角形以占用它的空间,而不是占用整个父布局。
实际上我的要求是:我在布局上有一个相对布局,我动态添加一些自定义 View 。这些具有用于拖动三角形中的点的触摸监听器,但它们正在全屏显示我的父 View ,因此我无法分别为父 View 和 subview 触发触摸监听器。
我花了无数的时间来开发这个问题的解决方案,但我就是无法理解它。任何帮助将不胜感激。
最佳答案
根据我收集的信息,您说,您在 CustomView
的 RelativeLayout
内绘制了一个三角形。实际的View
宽度和高度尺寸均为FILL_PARENT
。因此,表示三角形的可触摸区域的正方形与表示父RelativeLayout
的可触摸区域的正方形相同。
您希望三角形绘制区域内的触摸事件由三角形 View
接收,而外部的任何事件均由父级接收。据我所知,不可能定义自定义触摸区域。
但这并不能阻止您操纵绘图边界并触摸焦点来完成您想要的任务。
如何做到
确保带有三角形的
CustomView
始终接收触摸事件。当它接收到触摸事件时,它会执行基本数学运算来确定触摸是否在三角形区域内(您必须将用于绘制三角形的三角形边界保存为CustomView
的全局变量) .然后是一个简单的条件语句,用于确定是否执行并使用或传递事件(您是否希望在
RelativeLayout
上使用TouchEvent
来执行此操作什么?如果没有的话,这会让这件事变得容易得多)。
示例代码框架:
@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() 的问题。如果您的 Touches 处理顺序出现问题。
关于android - Canvas 中的圆圈占据整个父空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11498047/