在画布中圈出整个父级空间

时间:2012-07-16 04:22:17

标签: android android-layout android-canvas

我的父视图是RelativeLayout,我在其中添加了一个三角形来扩展View类。我用画布和油漆绘制三角形。我面临的问题是,当我触摸相对布局时,触摸听众,相对布局和三角形都被触发。我只是希望三角形能够根据需要采用确切的空间。如何限制我的自定义视图,在这种情况下三角形占用它的空间,而不是占用整个父布局。

其实我的要求是:我在布局上有一个相对布局我动态添加一些自定义视图。那些在三角形中有拖动点的触摸侦听器,但那些是全屏我的父视图,因为我无法单独为父视图和子视图触发触摸侦听器。

我花了无数个小时为这个问题开发解决方案,我无法理解它。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

根据我的收集,你说,你在RelativeLayout的{​​{1}}内绘制了一个三角形。宽度和高度的实际CustomView大小均为View。因此,表示三角形的可触摸区域的正方形与表示父FILL_PARENT可触摸区域的正方形相同。

您希望触摸三角形绘制区域内的事件,以便由三角形RelativeLayout接收,以及父级接收的任何外部事件。根据我的理解,无法定义自定义触摸区域。

这并不能阻止你操纵绘图边界和触摸焦点来完成你想要的东西。

如何完成

  1. 确保您的View与triange 始终接收触摸事件。当它接收到触摸事件时,它会执行基本数学运算以确定触摸是否在您的三角形区域内(您必须使用三角形边界来绘制保存为CustomView的全局变量的三角形)。

  2. 然后是一个简单的条件语句,用于确定是否采取行动,消费或传递事件(您是否希望CustomView上的TouchEvent做任何事情?如果不是这样做的话这更容易)。

  3. 示例代码框架:

    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,这样您的父视图就不会获得触摸事件。