Чтобы достичь того, что вы пытаетесь сделать, нужно выполнить несколько шагов:
Прежде всего вам нужно знать высоту и ширину обрабатываемой области, в пределах которой свободно перемещается плавающая кнопка. Для этого вы можете сделать что-то вроде этого:
int screenHeight, screenWidth;
root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
root.getViewTreeObserver().removeOnGlobalLayoutListener(this);
screenHeight = root.getHeight();
screenWidth = root.getWidth();
}
});
Здесь root - это родительское представление, в пределах которого может свободно перемещаться плавающая кнопка. Вы можете поместить этот код в onCreate вашей активности
Далее вам нужно вычислить радиус вашей плавающей кнопки. Это можно сделать примерно так:
int center;
Rect rectf = new Rect();
fab.getGlobalVisibleRect(rectf);
int height = rectf.height();
int width = rectf.width();
center = width/2;
Вуаля, теперь у вас есть нужные вам номера. Все, что вам теперь нужно сделать, это установить onTouchListener на кнопку fab и в MotionEvent.ACTION_MOVE проверить, равна ли центральная координата вашей кнопки + ее радиус равным или превышает ширину экрана или отрицательную (при горизонтальном перемещении) или координату центра + это радиус превышает высоту экрана или отрицательный (при вертикальном перемещении). В любом из этих случаев просто переместите фабрику назад влево, вправо, сверху или снизу, в зависимости от обстоятельств. Например: если fab перемещался вверх и достигал 0 x координаты (я рассматриваю весь экран как подвижную область), тогда мы можем установить x-cordinate fab равным ширине вида fab, деленной на 2, чтобы id не не двигайтесь над подвижной областью экрана.
Аналогичные логи c могут быть применены, чтобы удерживать потрясающую кнопку от перемещения влево, вправо или вниз от родителя. Удачи!