java - 如何使点击区域仅成为图像非矩形部分的一部分?

标签 java image mouseevent rectangles

我仅处理图像,并且用于查看应用程序的窗口尺寸在不同系统上可能有所不同。我有一个鼠标操作监听器,正在监听程序主视图上的点击。我有一个看起来像按钮的圆角矩形。我想让鼠标操作监听器只监听圆角矩形的区域,而不是所有系统上的整个图像。就像标题所说,并不是整个图像都有内容,特别是角落看起来不像图像的一部分,所以我不想让用户能够在没有内容的情况下单击图像的某些部分内容并获得与单击包含内容的部分相同的结果。 我的图像看起来与此类似 image
(来源:youthedesigner.com)

所以我只希望程序在用户单击图像内的按钮而不是按钮周围的漂亮内容时执行某些操作。 这就是我现在监听点击的内容:

@Override
public void mouseClicked(MouseEvent e) {
    for(int i = 0; i <= 200; i++) {
        if(e.getY() >= 100+i && e.getY() <= 300) {
            if(e.getX() >= 10+100-Math.pow(10000-(Math.pow((i-100),2.0)),.5)) && e.getX() <= 10+400-Math.pow(10000-(Math.pow((i-100),2.0)),.5))) {
                // do stuff
                i = 201;
            }
        }
    }
}

我在代码中使用的数学方程看起来像 110-(10000-(y-100)^2)^(1/2)),如果用图形表示,它看起来像一个左括号,而 410+ (10000-(y-100)^2)^(1/2)),看起来像距离第一个图 400 个单位的右括号。

该代码在我的系统上运行良好,但在其他系统上,它根本不起作用,我很好奇如何移动我正在收听的位置以对应于图像的缩放方式。

非常感谢您提供的任何帮助。

最佳答案

for 循环是多余的。

您可以确保按钮 (.png) 外部的像素具有一定的透明度,然后检查 Alpha 颜色分量。

在这种情况下,您可以添加一个矩形并查找它:

private boolean insideButton(Rectangle buttonRect, Point mousePt) {
    if (buttonRect.contains(mousePt)) {
        int r = buttonRect.height() / 2;
        if (mousePt.x < r) {
            // Left circle with O at (r, r)
            int xFromO = r - mousePt.x;
            int yFromO = r - mousePt.y;
            if (xFromO * xFromO + yFromO * yFromO > r * r) {
                return false; // Outside circle
            }
        }
        if (mousePt.x > buttonRect.right - r) {
            // Right circle:
            ...
        }
        return true;
    }
    return false;
}

关于java - 如何使点击区域仅成为图像非矩形部分的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13507000/

相关文章:

java - NullPointerException URLImageSource.getConnection(URLImageSource

c# - 为什么不推荐使用 mouse_event?

java - 如何使用 mongodb 的 Java 驱动程序将 $comment 添加到不同或聚合调用?

java - 在主屏幕上获取应用程序小部件的位置?

java - 如何从 java 类路径中的网络目录正确加载资源?

Java ImageIO 出奇地慢

java - 检查一个 8 亿条目的 hashmap 是否包含一个元素

python - 如何找到完成的表格扫描图像的轮廓?

c++ - 检查鼠标按钮是否在 C++ 中交换

c++ - 鼠标事件 BHO