From 5d37cc7ca6e3b01ac0a5614621351d7148db0616 Mon Sep 17 00:00:00 2001 From: Tungstend Date: Sun, 25 Feb 2024 16:49:31 +0800 Subject: [PATCH] Update ControlDirection.java --- .../fcl/control/view/ControlDirection.java | 129 ++++++++---------- 1 file changed, 57 insertions(+), 72 deletions(-) diff --git a/FCL/src/main/java/com/tungsten/fcl/control/view/ControlDirection.java b/FCL/src/main/java/com/tungsten/fcl/control/view/ControlDirection.java index eb68813a..c9c466fa 100644 --- a/FCL/src/main/java/com/tungsten/fcl/control/view/ControlDirection.java +++ b/FCL/src/main/java/com/tungsten/fcl/control/view/ControlDirection.java @@ -51,11 +51,11 @@ import java.util.UUID; @SuppressLint("ViewConstructor") public class ControlDirection extends RelativeLayout implements CustomView { - private final InvalidationListener notifyListener; - private final InvalidationListener dataChangeListener; - private final InvalidationListener boundaryListener; - private final InvalidationListener visibilityListener; - private final InvalidationListener alphaListener; + private InvalidationListener notifyListener; + private InvalidationListener dataChangeListener; + private InvalidationListener boundaryListener; + private InvalidationListener visibilityListener; + private InvalidationListener alphaListener; @Nullable private final GameMenu menu; @@ -195,6 +195,9 @@ public class ControlDirection extends RelativeLayout implements CustomView { alphaListener = null; post(() -> { + if (notifyListener == null || dataChangeListener == null || boundaryListener == null || visibilityListener == null) { + return; + } notifyData(); dataProperty.addListener(dataChangeListener); getData().addListener(notifyListener); @@ -202,6 +205,9 @@ public class ControlDirection extends RelativeLayout implements CustomView { } private void notifyData() { + if (visibilityListener == null) { + return; + } ControlDirectionData data = getData(); refreshBaseInfo(data); @@ -624,19 +630,15 @@ public class ControlDirection extends RelativeLayout implements CustomView { final int autoFitDist = ConvertUtils.dip2px(getContext(), 5); int dist = ConvertUtils.dip2px(getContext(), menu.getMenuSetting().getAutoFitDist()); - boolean xPref = false; - boolean yPref = false; - int prefX = 0; - int prefY = 0; - int selfX = 0; - int selfY = 0; - int xDist = autoFitDist; - int yDist = autoFitDist; - + boolean[] xyPref = {false, false}; + int[] prefXY = {0, 0}; + int[] selfXY = {0, 0}; + int[] xyDist = {autoFitDist, autoFitDist}; int left = (int) getX(); int right = (int) (getX() + getWidth()); int up = (int) getY(); int down = (int) (getY() + getHeight()); + int[] posArr = {left, right, up, down}; for (int i = 0; i < viewGroup.getChildCount(); i++) { if (viewGroup.getChildAt(i).getVisibility() == VISIBLE) { @@ -644,71 +646,49 @@ public class ControlDirection extends RelativeLayout implements CustomView { if (button == this || (!(button instanceof ControlButton) && !(button instanceof ControlDirection))) { continue; } - int buttonLeft = (int) button.getX(); - int buttonRight = (int) (button.getX() + button.getWidth()); - int buttonUp = (int) button.getY(); - int buttonDown = (int) (button.getY() + button.getHeight()); - - if (Math.abs(left - buttonLeft) < xDist) { - xPref = true; - prefX = buttonLeft; - xDist = left - buttonLeft; - selfX = left - xDist; - } - if (left - buttonRight >= 0 && left - buttonRight < xDist) { - xPref = true; - prefX = buttonRight; - xDist = left - buttonRight - dist; - selfX = left - xDist; - } - if (Math.abs(right - buttonRight) < xDist) { - xPref = true; - prefX = buttonRight; - xDist = right - buttonRight; - selfX = right - xDist; - } - if (buttonLeft - right >= 0 && buttonLeft - right < xDist) { - xPref = true; - prefX = buttonLeft; - xDist = right - buttonLeft + dist; - selfX = right - xDist; - } - if (Math.abs(up - buttonUp) < yDist) { - yPref = true; - prefY = buttonUp; - yDist = up - buttonUp; - selfY = up - yDist; - } - if (up - buttonDown >= 0 && up - buttonDown < yDist) { - yPref = true; - prefY = buttonDown; - yDist = up - buttonDown - dist; - selfY = up - yDist; - } - if (Math.abs(down - buttonDown) < yDist) { - yPref = true; - prefY = buttonDown; - yDist = down - buttonDown; - selfY = down - yDist; - } - if (buttonUp - down >= 0 && buttonUp - down < yDist) { - yPref = true; - prefY = buttonUp; - yDist = down - buttonUp + dist; - selfY = down - yDist; + //buttonLeft, buttonRight, buttonUp, buttonDown + int[] buttonPosArr = { + (int) button.getX(), + (int) (button.getX() + button.getWidth()), + (int) button.getY(), + (int) (button.getY() + button.getHeight()) + }; + /* + left - buttonLeft, left - buttonRight + right - buttonRight, right - buttonLeft + up - buttonUp, up - buttonDown + down - buttonDown, down - buttonUp + */ + int flag = -1; + for (int j = 0; j < posArr.length; j++) { + flag *= -1; + int xyIndex = j / 2 % 2; + if (Math.abs(posArr[j] - buttonPosArr[j]) < xyDist[xyIndex]) { + xyPref[xyIndex] = true; + prefXY[xyIndex] = buttonPosArr[j]; + xyDist[xyIndex] = posArr[j] - buttonPosArr[j]; + selfXY[xyIndex] = posArr[j] - xyDist[xyIndex]; + } + int buttonDist = posArr[j] - buttonPosArr[j + flag]; + if (flag * buttonDist >= 0 && flag * buttonDist < xyDist[xyIndex]) { + xyPref[xyIndex] = true; + prefXY[xyIndex] = buttonPosArr[j + flag]; + xyDist[xyIndex] = buttonDist - flag * dist; + selfXY[xyIndex] = posArr[j] - xyDist[xyIndex]; + } } } } - if (xPref) { - setX(left - xDist); - showLine(0, prefX, selfX); + if (xyPref[0]) { + setX(left - xyDist[0]); + showLine(0, prefXY[0], selfXY[0]); } else { removeLine(0); } - if (yPref) { - setY(up - yDist); - showLine(1, prefY, selfY); + if (xyPref[1]) { + setY(up - xyDist[1]); + showLine(1, prefXY[1], selfXY[1]); } else { removeLine(1); } @@ -960,5 +940,10 @@ public class ControlDirection extends RelativeLayout implements CustomView { } dataProperty.removeListener(dataChangeListener); getData().removeListener(notifyListener); + notifyListener = null; + dataChangeListener = null; + boundaryListener = null; + visibilityListener = null; + alphaListener = null; } }