2

我的父视图是一个RelativeLayout,我添加了一个三角形来扩展View 类。我使用画布和油漆绘制三角形。我面临的问题是,当我触摸相对布局时,触摸侦听器、相对布局和三角形都被触发。我只是想让三角形占据它需要的确切空间。我如何限制我的 customview ,在这种情况下为三角形以占用它的空间,而不是占用整个父布局。

实际上我的要求是:我在布局上有一个相对布局我正在动态添加一些自定义视图。那些具有用于在三角形中拖动点的触摸侦听器,但它们正在全屏显示我的父视图,因为我无法分别为父视图和子视图触发触摸侦听器。

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

4

2 回答 2

3

从我收集到的你所说的,你在 aRelativeLayout中画了一个三角形CustomView。实际View尺寸FILL_PARENT适用于宽度和高度。所以表示三角形可触摸区域的正方形与表示父元素可触摸区域的正方形相同RelativeLayout

您希望三角形绘制区域内的触摸事件由三角形接收,View而外部的任何触摸事件都由父级接收。据我了解,无法定义自定义触摸区域。

这不会阻止您操纵绘图边界和触摸焦点来完成您想要的。

怎么做

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

  2. 然后是一个简单的条件语句来确定是否采取行动并消费或传递事件(你甚至想要TouchEventRelativeLayout做任何事情吗?如果不是这样会让这更容易)。

示例代码骨架:

@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()的玩弄。

于 2012-07-23T04:26:19.967 回答
1

您在处理三角形的触摸事件时遇到了问题,因为您同时接触了视图 RalativeLayout 和您的自定义视图。

要解决此问题,您必须对 customview 的 onTouchEvent 进行一些更改。就像如果您正在触摸 customview 并且如果您想处理该事件,那么从 onTouchEvent 您将必须返回true而不是 false ,这样您的父视图将不会获得触摸事件。

于 2012-07-16T05:12:50.620 回答