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")
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;
//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];
}
if (left - buttonRight >= 0 && left - buttonRight < xDist) {
xPref = true;
prefX = buttonRight;
xDist = left - buttonRight - dist;
selfX = left - xDist;
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 (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;
}
}
}
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;
}
}