Update ControlDirection.java

This commit is contained in:
Tungstend 2024-02-25 16:49:31 +08:00
parent c69661df03
commit 5d37cc7ca6
1 changed files with 57 additions and 72 deletions

View File

@ -51,11 +51,11 @@ import java.util.UUID;
@SuppressLint("ViewConstructor") @SuppressLint("ViewConstructor")
public class ControlDirection extends RelativeLayout implements CustomView { public class ControlDirection extends RelativeLayout implements CustomView {
private final InvalidationListener notifyListener; private InvalidationListener notifyListener;
private final InvalidationListener dataChangeListener; private InvalidationListener dataChangeListener;
private final InvalidationListener boundaryListener; private InvalidationListener boundaryListener;
private final InvalidationListener visibilityListener; private InvalidationListener visibilityListener;
private final InvalidationListener alphaListener; private InvalidationListener alphaListener;
@Nullable @Nullable
private final GameMenu menu; private final GameMenu menu;
@ -195,6 +195,9 @@ public class ControlDirection extends RelativeLayout implements CustomView {
alphaListener = null; alphaListener = null;
post(() -> { post(() -> {
if (notifyListener == null || dataChangeListener == null || boundaryListener == null || visibilityListener == null) {
return;
}
notifyData(); notifyData();
dataProperty.addListener(dataChangeListener); dataProperty.addListener(dataChangeListener);
getData().addListener(notifyListener); getData().addListener(notifyListener);
@ -202,6 +205,9 @@ public class ControlDirection extends RelativeLayout implements CustomView {
} }
private void notifyData() { private void notifyData() {
if (visibilityListener == null) {
return;
}
ControlDirectionData data = getData(); ControlDirectionData data = getData();
refreshBaseInfo(data); refreshBaseInfo(data);
@ -624,19 +630,15 @@ public class ControlDirection extends RelativeLayout implements CustomView {
final int autoFitDist = ConvertUtils.dip2px(getContext(), 5); final int autoFitDist = ConvertUtils.dip2px(getContext(), 5);
int dist = ConvertUtils.dip2px(getContext(), menu.getMenuSetting().getAutoFitDist()); int dist = ConvertUtils.dip2px(getContext(), menu.getMenuSetting().getAutoFitDist());
boolean xPref = false; boolean[] xyPref = {false, false};
boolean yPref = false; int[] prefXY = {0, 0};
int prefX = 0; int[] selfXY = {0, 0};
int prefY = 0; int[] xyDist = {autoFitDist, autoFitDist};
int selfX = 0;
int selfY = 0;
int xDist = autoFitDist;
int yDist = autoFitDist;
int left = (int) getX(); int left = (int) getX();
int right = (int) (getX() + getWidth()); int right = (int) (getX() + getWidth());
int up = (int) getY(); int up = (int) getY();
int down = (int) (getY() + getHeight()); int down = (int) (getY() + getHeight());
int[] posArr = {left, right, up, down};
for (int i = 0; i < viewGroup.getChildCount(); i++) { for (int i = 0; i < viewGroup.getChildCount(); i++) {
if (viewGroup.getChildAt(i).getVisibility() == VISIBLE) { 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))) { if (button == this || (!(button instanceof ControlButton) && !(button instanceof ControlDirection))) {
continue; continue;
} }
int buttonLeft = (int) button.getX(); //buttonLeft, buttonRight, buttonUp, buttonDown
int buttonRight = (int) (button.getX() + button.getWidth()); int[] buttonPosArr = {
int buttonUp = (int) button.getY(); (int) button.getX(),
int buttonDown = (int) (button.getY() + button.getHeight()); (int) (button.getX() + button.getWidth()),
(int) button.getY(),
if (Math.abs(left - buttonLeft) < xDist) { (int) (button.getY() + button.getHeight())
xPref = true; };
prefX = buttonLeft; /*
xDist = left - buttonLeft; left - buttonLeft, left - buttonRight
selfX = left - xDist; right - buttonRight, right - buttonLeft
} up - buttonUp, up - buttonDown
if (left - buttonRight >= 0 && left - buttonRight < xDist) { down - buttonDown, down - buttonUp
xPref = true; */
prefX = buttonRight; int flag = -1;
xDist = left - buttonRight - dist; for (int j = 0; j < posArr.length; j++) {
selfX = left - xDist; flag *= -1;
} int xyIndex = j / 2 % 2;
if (Math.abs(right - buttonRight) < xDist) { if (Math.abs(posArr[j] - buttonPosArr[j]) < xyDist[xyIndex]) {
xPref = true; xyPref[xyIndex] = true;
prefX = buttonRight; prefXY[xyIndex] = buttonPosArr[j];
xDist = right - buttonRight; xyDist[xyIndex] = posArr[j] - buttonPosArr[j];
selfX = right - xDist; selfXY[xyIndex] = posArr[j] - xyDist[xyIndex];
} }
if (buttonLeft - right >= 0 && buttonLeft - right < xDist) { int buttonDist = posArr[j] - buttonPosArr[j + flag];
xPref = true; if (flag * buttonDist >= 0 && flag * buttonDist < xyDist[xyIndex]) {
prefX = buttonLeft; xyPref[xyIndex] = true;
xDist = right - buttonLeft + dist; prefXY[xyIndex] = buttonPosArr[j + flag];
selfX = right - xDist; xyDist[xyIndex] = buttonDist - flag * dist;
} selfXY[xyIndex] = posArr[j] - xyDist[xyIndex];
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;
} }
} }
} }
if (xPref) { if (xyPref[0]) {
setX(left - xDist); setX(left - xyDist[0]);
showLine(0, prefX, selfX); showLine(0, prefXY[0], selfXY[0]);
} else { } else {
removeLine(0); removeLine(0);
} }
if (yPref) { if (xyPref[1]) {
setY(up - yDist); setY(up - xyDist[1]);
showLine(1, prefY, selfY); showLine(1, prefXY[1], selfXY[1]);
} else { } else {
removeLine(1); removeLine(1);
} }
@ -960,5 +940,10 @@ public class ControlDirection extends RelativeLayout implements CustomView {
} }
dataProperty.removeListener(dataChangeListener); dataProperty.removeListener(dataChangeListener);
getData().removeListener(notifyListener); getData().removeListener(notifyListener);
notifyListener = null;
dataChangeListener = null;
boundaryListener = null;
visibilityListener = null;
alphaListener = null;
} }
} }