在我的应用案例中,我需要一个点击监听器,只需点击FAB的圈子即可触发,避免方形容器内的点击(56x56)。
我已经在考虑在我的"整个"中的每个onClick事件中获取X,Y按钮,然后验证它是否在我的Fab圈内,但我想逃避这种解决方法,因为它可能导致精确点击不同设备分辨率的问题。
您对替代解决方案有什么想法吗?
提前致谢。
编辑:
我实际上实现了这个用Java翻译的javascript-solution
LINK
您认为我将始终在设备屏幕更改上获得相同的准确度吗?
答案 0 :(得分:0)
我认为没有办法实际制作除矩形之外的可点击区域。 如果您的圆圈是图像,则应使浮动按钮的宽度和高度设置为wrap_content。你应该设置它的宽度和高度以匹配圆的直径。并像这样处理事件:
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
ViewGroup.LayoutParams layoutParams = v.getLayoutParams();
float radius = layoutParams.width / 2f;
float x = event.getX() - radius;
float y = event.getY() - radius;
if (isInCircle(radius, x, y)) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
// perform your action
}
return true;
} else {
return false;
}
}
private boolean isInCircle(float radius, float x, float y) {
if (Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) < radius) {
//touch was performed inside the circle;
return true;
} else {
//touched ouside the circle
return false;
}
}
}
);
这适用于任何设备,只要您的按钮紧紧围绕您绘制的圆圈。
如果您不需要触摸事件更深,当您错过圆圈时,在浮动按钮下,您可以避免一些冗余计算:
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
ViewGroup.LayoutParams layoutParams = v.getLayoutParams();
float radius = layoutParams.width / 2f;
float x = event.getX() - radius;
float y = event.getY() - radius;
if (isInCircle(radius, x, y)) {
// perform your action
}
}
return true;
}
private boolean isInCircle(float radius, float x, float y) {
if (Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) < radius) {
//touch was performed inside the circle;
return true;
} else {
//touched ouside the circle
return false;
}
}
}
);
请注意,要使其正常工作,您的按钮应严格为矩形。如果你想一个按钮是一个椭圆,那么数学应该是不同的。