Update ControlDirection.java
This commit is contained in:
parent
c69661df03
commit
5d37cc7ca6
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue