android - Canvas 中的圆圈占据整个父空间

标签 android android-layout android-canvas

我的父 View 是一个RelativeLayout,我添加了一个三角形来扩展View类。我使用 Canvas 和颜料绘制三角形。我面临的问题是,当我触摸相对布局时,两个触摸监听器、相对布局和三角形都会被触发。我只希望三角形占据所需的确切空间。在这种情况下,我如何限制我的 customview ,三角形以占用它的空间,而不是占用整个父布局。

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

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

最佳答案

根据我收集的信息,您说,您在 CustomViewRelativeLayout 内绘制了一个三角形。实际的View 宽度和高度尺寸均为FILL_PARENT。因此,表示三角形的可触摸区域的正方形与表示父RelativeLayout可触摸区域的正方形相同。

您希望三角形绘制区域内的触摸事件由三角形 View 接收,而外部的任何事件均由父级接收。据我所知,不可能定义自定义触摸区域。

但这并不能阻止您操纵绘图边界并触摸焦点来完成您想要的任务。

如何做到

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

  2. 然后是一个简单的条件语句,用于确定是否执行并使用或传递事件(您是否希望在 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/

相关文章:

安卓 Canvas : draw transparent circle on image

位图变化中心的Android矩阵旋转

android - 将复制的文本粘贴到 Webview 页面

android - 显示软键盘时背景布局移动 - android

android - 提示用户对应用内的 Android 应用进行评分

android - 如何在应用程序首选项屏幕的 ActionBar 中显示文本?

java - ExceptionInInitializerError - 服务和库

java - Android 中双击恢复 Canvas

javascript - 使用 jquery mobile 和 cordova 无法刷新可折叠 ListView 的标题

c# - 无法将 JSON 写入文件 (Xamarin C#)