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