如何仅允许在“浮点操作按钮”圈内点击?

时间:2016-10-28 10:35:12

标签: android android-layout android-view floating-action-button

这些是google规范之后的FAB尺寸。 enter image description here

在我的应用案例中,我需要一个点击监听器,只需点击FAB的圈子即可触发,避免方形容器内的点击(56x56)。

我已经在考虑在我的"整个"中的每个onClick事件中获取X,Y按钮,然后验证它是否在我的Fab圈内,但我想逃避这种解决方法,因为它可能导致精确点击不同设备分辨率的问题。

您对替代解决方案有什么想法吗?

提前致谢。

编辑:

我实际上实现了这个用Java翻译的javascript-solution
LINK
您认为我将始终在设备屏幕更改上获得相同的准确度吗?

1 个答案:

答案 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;
                                    }
                                }
                            }
    );

请注意,要使其正常工作,您的按钮应严格为矩形。如果你想一个按钮是一个椭圆,那么数学应该是不同的。