package com.nightonke.boommenu.BoomButtons;
import android.graphics.Point;
import com.nightonke.boommenu.Util;
import java.util.ArrayList;
/**
* Created by Weiping Huang at 20:26 on 16/11/19
* For Personal Open Source
* Contact me at 2584541288@qq.com or nightonke@outlook.com
* For more projects: https://github.com/Nightonke
*/
public class ButtonPlaceManager {
public static ArrayList<Point> getCircleButtonPositions(ButtonPlaceEnum placeEnum,
ButtonPlaceAlignmentEnum alignmentEnum,
Point parentSize,
float radius,
int buttonNumber,
float buttonHorizontalMargin,
float buttonVerticalMargin,
float buttonInclinedMargin,
float buttonTopMargin,
float buttonBottomMargin,
float buttonLeftMargin,
float buttonRightMargin) {
ArrayList<Point> positions = new ArrayList<>(buttonNumber);
float a, b, c, e, r = radius;
float hm = buttonHorizontalMargin, vm = buttonVerticalMargin, im = buttonInclinedMargin;
int h = buttonNumber / 2;
switch (placeEnum) {
case Horizontal:
if (buttonNumber % 2 == 0) {
for (int i = h - 1; i >= 0; i--) positions.add(point(-r - hm / 2 - i * (2 * r + hm), 0));
for (int i = 0; i < h; i++) positions.add(point(r + hm / 2 + i * (2 * r + hm), 0));
} else {
for (int i = h - 1; i >= 0; i--) positions.add(point(-2 * r - hm - i * (2 * r + hm), 0));
positions.add(point(0, 0));
for (int i = 0; i < h; i++) positions.add(point(2 * r + hm + i * (2 * r + hm), 0));
}
break;
case Vertical:
if (buttonNumber % 2 == 0) {
for (int i = h - 1; i >= 0; i--) positions.add(point(0, -r - vm / 2 - i * (2 * r + vm)));
for (int i = 0; i < h; i++) positions.add(point(0, r + vm / 2 + i * (2 * r + vm)));
} else {
for (int i = h - 1; i >= 0; i--) positions.add(point(0, -2 * r - vm - i * (2 * r + vm)));
positions.add(point(0, 0));
for (int i = 0; i < h; i++) positions.add(point(0, 2 * r + vm + i * (2 * r + vm)));
}
break;
case SC_1:
positions.add(point(0, 0));
break;
case SC_2_1:
positions.add(point(-hm / 2 - r, 0));
positions.add(point(hm / 2 + r, 0));
break;
case SC_2_2:
positions.add(point(0, -vm / 2 - r));
positions.add(point(0, vm / 2 + r));
break;
case SC_3_1:
positions.add(point(-hm - 2 * r, 0));
positions.add(point(0, 0));
positions.add(point(hm + 2 * r, 0));
break;
case SC_3_2:
positions.add(point(0, -vm - 2 * r));
positions.add(point(0, 0));
positions.add(point(0, vm + 2 * r));
break;
case SC_3_3:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(-b, -a));
positions.add(point(b, -a));
positions.add(point(0, c));
break;
case SC_3_4:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(0, -c));
positions.add(point(-b, a));
positions.add(point(b, a));
break;
case SC_4_1:
positions.add(point(-hm / 2 - r, -vm / 2 - r));
positions.add(point(hm / 2 + r, -vm / 2 - r));
positions.add(point(-hm / 2 - r, vm / 2 + r));
positions.add(point(hm / 2 + r, vm / 2 + r));
break;
case SC_4_2:
a = (float) ((2 * r + im) / Math.sqrt(2));
positions.add(point(0, -a));
positions.add(point(a, 0));
positions.add(point(0, a));
positions.add(point(-a, 0));
break;
case SC_5_1:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(-2 * b, -c));
positions.add(point(0, -c));
positions.add(point(2 * b, -c));
positions.add(point(-hm / 2 - r, a));
positions.add(point(hm / 2 + r, a));
break;
case SC_5_2:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(hm / 2 + r, -a));
positions.add(point(-hm / 2 - r, -a));
positions.add(point(2 * b, c));
positions.add(point(0, c));
positions.add(point(-2 * b, c));
break;
case SC_5_3:
positions.add(point(0, 0));
positions.add(point(0, -vm - 2 * r));
positions.add(point(hm + 2 * r, 0));
positions.add(point(0, vm + 2 * r));
positions.add(point(-hm - 2 * r, 0));
break;
case SC_5_4:
a = (float) ((2 * r + im) / Math.sqrt(2));
positions.add(point(0, 0));
positions.add(point(a, -a));
positions.add(point(a, a));
positions.add(point(-a, a));
positions.add(point(-a, -a));
break;
case SC_6_1:
positions.add(point(-hm - 2 * r, -vm / 2 - r));
positions.add(point(0, -vm / 2 - r));
positions.add(point(hm + 2 * r, -vm / 2 - r));
positions.add(point(-hm - 2 * r, vm / 2 + r));
positions.add(point(0, vm / 2 + r));
positions.add(point(hm + 2 * r, vm / 2 + r));
break;
case SC_6_2:
positions.add(point(-hm / 2 - r, -vm - 2 * r));
positions.add(point(-hm / 2 - r, 0));
positions.add(point(-hm / 2 - r, vm + 2 * r));
positions.add(point(hm / 2 + r, -vm - 2 * r));
positions.add(point(hm / 2 + r, 0));
positions.add(point(hm / 2 + r, vm + 2 * r));
break;
case SC_6_3:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(-b, -a - c));
positions.add(point(b, -a - c));
positions.add(point(2 * b, 0));
positions.add(point(b, a + c));
positions.add(point(-b, a + c));
positions.add(point(-2 * b, 0));
break;
case SC_6_4:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(0, -2 * b));
positions.add(point(a + c, -b));
positions.add(point(a + c, b));
positions.add(point(0, 2 * b));
positions.add(point(-a - c, b));
positions.add(point(-a - c, -b));
break;
case SC_6_5:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
e = c - a;
positions.add(point(-2 * b, -a - c + e));
positions.add(point(0, -a - c + e));
positions.add(point(2 * b, -a - c + e));
positions.add(point(-hm / 2 - r, e));
positions.add(point(hm / 2 + r, e));
positions.add(point(0, a + c + e));
break;
case SC_6_6:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
e = c - a;
positions.add(point(0, -a - c - e));
positions.add(point(-hm / 2 - r, -e));
positions.add(point(hm / 2 + r, -e));
positions.add(point(-2 * b, a + c - e));
positions.add(point(0, a + c - e));
positions.add(point(2 * b, a + c - e));
break;
case SC_7_1:
positions.add(point(-hm - 2 * r, -vm - 2 * r));
positions.add(point(0, -vm - 2 * r));
positions.add(point(hm + 2 * r, -vm - 2 * r));
positions.add(point(-hm - 2 * r, 0));
positions.add(point(0, 0));
positions.add(point(hm + 2 * r, 0));
positions.add(point(0, vm + 2 * r));
break;
case SC_7_2:
positions.add(point(0, -vm - 2 * r));
positions.add(point(-hm - 2 * r, 0));
positions.add(point(0, 0));
positions.add(point(hm + 2 * r, 0));
positions.add(point(-hm - 2 * r, vm + 2 * r));
positions.add(point(0, vm + 2 * r));
positions.add(point(hm + 2 * r, vm + 2 * r));
break;
case SC_7_3:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(0, 0));
positions.add(point(-b, -a - c));
positions.add(point(b, -a - c));
positions.add(point(2 * b, 0));
positions.add(point(b, a + c));
positions.add(point(-b, a + c));
positions.add(point(-2 * b, 0));
break;
case SC_7_4:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(0, 0));
positions.add(point(0, -2 * b));
positions.add(point(a + c, -b));
positions.add(point(a + c, b));
positions.add(point(0, 2 * b));
positions.add(point(-a - c, b));
positions.add(point(-a - c, -b));
break;
case SC_7_5:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(-3 * b, -a));
positions.add(point(-b, -a));
positions.add(point(b, -a));
positions.add(point(3 * b, -a));
positions.add(point(-2 * b, c));
positions.add(point(0, c));
positions.add(point(2 * b, c));
break;
case SC_7_6:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(-2 * b, -c));
positions.add(point(0, -c));
positions.add(point(2 * b, -c));
positions.add(point(-3 * b, a));
positions.add(point(-b, a));
positions.add(point(b, a));
positions.add(point(3 * b, a));
break;
case SC_8_1:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(-2 * b, -a - c));
positions.add(point(0, -a - c));
positions.add(point(2 * b, -a - c));
positions.add(point(-hm / 2 - r, 0));
positions.add(point(hm / 2 + r, 0));
positions.add(point(-2 * b, a + c));
positions.add(point(0, a + c));
positions.add(point(2 * b, a + c));
break;
case SC_8_2:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(-a - c, -2 * b));
positions.add(point(-a - c, 0));
positions.add(point(-a - c, 2 * b));
positions.add(point(0, -vm / 2 - r));
positions.add(point(0, vm / 2 + r));
positions.add(point(a + c, -2 * b));
positions.add(point(a + c, 0));
positions.add(point(a + c, 2 * b));
break;
case SC_8_3:
positions.add(point(-hm - 2 * r, -vm - 2 * r));
positions.add(point(0, -vm - 2 * r));
positions.add(point(hm + 2 * r, -vm - 2 * r));
positions.add(point(-hm - 2 * r, 0));
positions.add(point(hm + 2 * r, 0));
positions.add(point(-hm - 2 * r, vm + 2 * r));
positions.add(point(0, vm + 2 * r));
positions.add(point(hm + 2 * r, vm + 2 * r));
break;
case SC_8_4:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(0, -2 * a - 2 * c));
positions.add(point(-hm / 2 - r, -a - c));
positions.add(point(hm / 2 + r, -a - c));
positions.add(point(-2 * b, 0));
positions.add(point(2 * b, 0));
positions.add(point(-hm / 2 - r, a + c));
positions.add(point(hm / 2 + r, a + c));
positions.add(point(0, 2 * a + 2 * c));
break;
case SC_8_5:
a = (float) ((2 * r + im) / Math.sqrt(2));
positions.add(point(0, -2 * a));
positions.add(point(a, -a));
positions.add(point(2 * a, 0));
positions.add(point(a, a));
positions.add(point(0, 2 * a));
positions.add(point(-a, a));
positions.add(point(-2 * a, 0));
positions.add(point(-a, -a));
break;
case SC_8_6:
positions.add(point(-hm * 3 / 2 - 3 * r, -vm / 2 - r));
positions.add(point(-hm / 2 - r, -vm / 2 - r));
positions.add(point(hm / 2 + r, -vm / 2 - r));
positions.add(point(hm * 3 / 2 + 3 * r, -vm / 2 - r));
positions.add(point(-hm * 3 / 2 - 3 * r, vm / 2 + r));
positions.add(point(-hm / 2 - r, vm / 2 + r));
positions.add(point(hm / 2 + r, vm / 2 + r));
positions.add(point(hm * 3 / 2 + 3 * r, vm / 2 + r));
break;
case SC_8_7:
positions.add(point(-hm / 2 - r, -vm * 3 / 2 - 3 * r));
positions.add(point(hm / 2 + r, -vm * 3 / 2 - 3 * r));
positions.add(point(-hm / 2 - r, -vm / 2 - r));
positions.add(point(hm / 2 + r, -vm / 2 - r));
positions.add(point(-hm / 2 - r, vm / 2 + r));
positions.add(point(hm / 2 + r, vm / 2 + r));
positions.add(point(-hm / 2 - r, vm * 3 / 2 + 3 * r));
positions.add(point(hm / 2 + r, vm * 3 / 2 + 3 * r));
break;
case SC_9_1:
positions.add(point(-hm - 2 * r, -vm - 2 * r));
positions.add(point(0, -vm - 2 * r));
positions.add(point(hm + 2 * r, -vm - 2 * r));
positions.add(point(-hm - 2 * r, 0));
positions.add(point(0, 0));
positions.add(point(hm + 2 * r, 0));
positions.add(point(-hm - 2 * r, vm + 2 * r));
positions.add(point(0, vm + 2 * r));
positions.add(point(hm + 2 * r, vm + 2 * r));
break;
case SC_9_2:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(0, -2 * a - 2 * c));
positions.add(point(-hm / 2 - r, -a - c));
positions.add(point(hm / 2 + r, -a - c));
positions.add(point(-2 * b, 0));
positions.add(point(0, 0));
positions.add(point(2 * b, 0));
positions.add(point(-hm / 2 - r, a + c));
positions.add(point(hm / 2 + r, a + c));
positions.add(point(0, 2 * a + 2 * c));
break;
case SC_9_3:
a = (float) ((2 * r + im) / Math.sqrt(2));
positions.add(point(0, -2 * a));
positions.add(point(a, -a));
positions.add(point(2 * a, 0));
positions.add(point(a, a));
positions.add(point(0, 0));
positions.add(point(0, 2 * a));
positions.add(point(-a, a));
positions.add(point(-2 * a, 0));
positions.add(point(-a, -a));
break;
}
calculatePositionsInParent(positions, parentSize);
calculateOffset(
positions,
alignmentEnum,
parentSize,
radius * 2,
radius * 2,
buttonTopMargin,
buttonBottomMargin,
buttonLeftMargin,
buttonRightMargin);
return positions;
}
public static ArrayList<Point> getCircleButtonPositions(ButtonPlaceEnum placeEnum,
ButtonPlaceAlignmentEnum alignmentEnum,
Point parentSize,
float buttonWidth,
float buttonHeight,
int buttonNumber,
float buttonHorizontalMargin,
float buttonVerticalMargin,
float buttonInclinedMargin,
float buttonTopMargin,
float buttonBottomMargin,
float buttonLeftMargin,
float buttonRightMargin) {
ArrayList<Point> positions = new ArrayList<>(buttonNumber);
float a, b, c, e, w = buttonWidth, h = buttonHeight;
float hm = buttonHorizontalMargin, vm = buttonVerticalMargin, im = buttonInclinedMargin;
int half = buttonNumber / 2;
switch (placeEnum) {
case Horizontal:
if (buttonNumber % 2 == 0) {
for (int i = half - 1; i >= 0; i--) positions.add(point(-w / 2 - hm / 2 - i * (w + hm), 0));
for (int i = 0; i < half; i++) positions.add(point(w / 2 + hm / 2 + i * (w + hm), 0));
} else {
for (int i = half - 1; i >= 0; i--) positions.add(point(-w - hm - i * (w + hm), 0));
positions.add(point(0, 0));
for (int i = 0; i < half; i++) positions.add(point(w + hm + i * (w + hm), 0));
}
break;
case Vertical:
if (buttonNumber % 2 == 0) {
for (int i = half - 1; i >= 0; i--) positions.add(point(0, -h / 2 - vm / 2 - i * (h + vm)));
for (int i = 0; i < half; i++) positions.add(point(0, h / 2 + vm / 2 + i * (h + vm)));
} else {
for (int i = half - 1; i >= 0; i--) positions.add(point(0, -h - vm - i * (h + vm)));
positions.add(point(0, 0));
for (int i = 0; i < half; i++) positions.add(point(0, h + vm + i * (h + vm)));
}
break;
case SC_1:
positions.add(point(0, 0));
break;
case SC_2_1:
positions.add(point(-hm / 2 - w / 2, 0));
positions.add(point(hm / 2 + w / 2, 0));
break;
case SC_2_2:
positions.add(point(0, -vm / 2 - h / 2));
positions.add(point(0, vm / 2 + h / 2));
break;
case SC_3_1:
positions.add(point(-hm - w, 0));
positions.add(point(0, 0));
positions.add(point(hm + w, 0));
break;
case SC_3_2:
positions.add(point(0, -vm - h));
positions.add(point(0, 0));
positions.add(point(0, vm + h));
break;
case SC_3_3:
positions.add(point(-hm / 2 - w / 2, -vm / 2 - h / 2));
positions.add(point(hm / 2 + w / 2, -vm / 2 - h / 2));
positions.add(point(0, vm / 2 + h / 2));
break;
case SC_3_4:
positions.add(point(0, -vm / 2 - h / 2));
positions.add(point(-hm / 2 - w / 2, vm / 2 + h / 2));
positions.add(point(hm / 2 + w / 2, vm / 2 + h / 2));
break;
case SC_4_1:
positions.add(point(-hm / 2 - w / 2, -vm / 2 - h / 2));
positions.add(point(hm / 2 + w / 2, -vm / 2 - h / 2));
positions.add(point(-hm / 2 - w / 2, vm / 2 + h / 2));
positions.add(point(hm / 2 + w / 2, vm / 2 + h / 2));
break;
case SC_4_2:
positions.add(point(0, -vm / 2 - h / 2));
positions.add(point(hm + w, 0));
positions.add(point(0, vm / 2 + h / 2));
positions.add(point(-hm - w, 0));
break;
case SC_5_1:
positions.add(point(-hm - w, -vm / 2 - h / 2));
positions.add(point(0, -vm / 2 - h / 2));
positions.add(point(hm + w, -vm / 2 - h / 2));
positions.add(point(-hm / 2 - w / 2, vm / 2 + h / 2));
positions.add(point(hm / 2 + w / 2, vm / 2 + h / 2));
break;
case SC_5_2:
positions.add(point(-hm / 2 - w / 2, -vm / 2 - h / 2));
positions.add(point(hm / 2 + w / 2, -vm / 2 - h / 2));
positions.add(point(-hm - w, vm / 2 + h / 2));
positions.add(point(0, vm / 2 + h / 2));
positions.add(point(hm + w, vm / 2 + h / 2));
break;
case SC_5_3:
positions.add(point(0, -vm - h));
positions.add(point(-hm - w, 0));
positions.add(point(0, 0));
positions.add(point(hm + w, 0));
positions.add(point(0, vm + h));
break;
case SC_5_4:
positions.add(point(-hm - w, -vm / 2 - h / 2));
positions.add(point(hm + w, -vm / 2 - h / 2));
positions.add(point(0, 0));
positions.add(point(-hm - w, vm / 2 + h / 2));
positions.add(point(hm + w, vm / 2 + h / 2));
break;
case SC_6_1:
positions.add(point(-hm - w, -vm / 2 - h / 2));
positions.add(point(0, -vm / 2 - h / 2));
positions.add(point(hm + w, -vm / 2 - h / 2));
positions.add(point(-hm - w, vm / 2 + h / 2));
positions.add(point(0, vm / 2 + h / 2));
positions.add(point(hm + w, vm / 2 + h / 2));
break;
case SC_6_2:
positions.add(point(-hm / 2 - w / 2, -vm - h));
positions.add(point(-hm / 2 - w / 2, 0));
positions.add(point(-hm / 2 - w / 2, vm + h));
positions.add(point(hm / 2 + w / 2, -vm - h));
positions.add(point(hm / 2 + w / 2, 0));
positions.add(point(hm / 2 + w / 2, vm + h));
break;
case SC_6_3:
positions.add(point(-hm / 2 - w / 2, -vm - h));
positions.add(point(hm / 2 + w / 2, -vm - h));
positions.add(point(-hm - w, 0));
positions.add(point(hm + w, 0));
positions.add(point(-hm / 2 - w / 2, vm + h));
positions.add(point(hm / 2 + w / 2, vm + h));
break;
case SC_6_4:
positions.add(point(0, -vm - h));
positions.add(point(hm + w, -vm / 2 - h / 2));
positions.add(point(hm + w, vm / 2 + h / 2));
positions.add(point(0, vm + h));
positions.add(point(-hm - w, -vm / 2 - h / 2));
positions.add(point(-hm - w, vm / 2 + h / 2));
break;
case SC_6_5:
positions.add(point(-hm - w, -vm - h));
positions.add(point(0, -vm - h));
positions.add(point(hm + w, -vm - h));
positions.add(point(-hm / 2 - w / 2, 0));
positions.add(point(hm / 2 + w / 2, 0));
positions.add(point(0, vm + h));
break;
case SC_6_6:
positions.add(point(0, -vm - h));
positions.add(point(-hm / 2 - w / 2, 0));
positions.add(point(hm / 2 + w / 2, 0));
positions.add(point(-hm - w, vm + h));
positions.add(point(0, vm + h));
positions.add(point(hm + w, vm + h));
break;
case SC_7_1:
positions.add(point(-hm - w, -vm - h));
positions.add(point(0, -vm - h));
positions.add(point(hm + w, -vm - h));
positions.add(point(-hm - w, 0));
positions.add(point(0, 0));
positions.add(point(hm + w, 0));
positions.add(point(0, vm + h));
break;
case SC_7_2:
positions.add(point(0, -vm - h));
positions.add(point(-hm - w, 0));
positions.add(point(0, 0));
positions.add(point(hm + w, 0));
positions.add(point(-hm - w, vm + h));
positions.add(point(0, vm + h));
positions.add(point(hm + w, vm + h));
break;
case SC_7_3:
positions.add(point(-hm / 2 - w / 2, -vm - h));
positions.add(point(hm / 2 + w / 2, -vm - h));
positions.add(point(-hm - w, 0));
positions.add(point(0, 0));
positions.add(point(hm + w, 0));
positions.add(point(-hm / 2 - w / 2, vm + h));
positions.add(point(hm / 2 + w / 2, vm + h));
break;
case SC_7_4:
positions.add(point(0, -vm - h));
positions.add(point(hm + w, -vm / 2 - h / 2));
positions.add(point(hm + w, vm / 2 + h / 2));
positions.add(point(0, 0));
positions.add(point(0, vm + h));
positions.add(point(-hm - w, -vm / 2 - h / 2));
positions.add(point(-hm - w, vm / 2 + h / 2));
break;
case SC_7_5:
positions.add(point(-hm * 3 / 2 - w * 3 / 2, -vm / 2 - h / 2));
positions.add(point(-hm / 2 - w / 2, -vm / 2 - h / 2));
positions.add(point(hm / 2 + w / 2, -vm / 2 - h / 2));
positions.add(point(hm * 3 / 2 + w * 3 / 2, -vm / 2 - h / 2));
positions.add(point(-hm - w, vm / 2 + h / 2));
positions.add(point(0, vm / 2 + h / 2));
positions.add(point(hm + w, vm / 2 + h / 2));
break;
case SC_7_6:
positions.add(point(-hm - w, -vm / 2 - h / 2));
positions.add(point(0, -vm / 2 - h / 2));
positions.add(point(hm + w, -vm / 2 - h / 2));
positions.add(point(-hm * 3 / 2 - w * 3 / 2, vm / 2 + h / 2));
positions.add(point(-hm / 2 - w / 2, vm / 2 + h / 2));
positions.add(point(hm / 2 + w / 2, vm / 2 + h / 2));
positions.add(point(hm * 3 / 2 + w * 3 / 2, vm / 2 + h / 2));
break;
case SC_8_1:
positions.add(point(-hm - w, -vm - h));
positions.add(point(0, -vm - h));
positions.add(point(hm + w, -vm - h));
positions.add(point(-hm / 2 - w / 2, 0));
positions.add(point(hm / 2 + w / 2, 0));
positions.add(point(-hm - w, vm + h));
positions.add(point(0, vm + h));
positions.add(point(hm + w, vm + h));
break;
case SC_8_2:
positions.add(point(-hm - w, -vm - h));
positions.add(point(-hm - w, 0));
positions.add(point(-hm - w, vm + h));
positions.add(point(0, -vm / 2 - h / 2));
positions.add(point(0, vm / 2 + h / 2));
positions.add(point(hm + w, -vm - h));
positions.add(point(hm + w, 0));
positions.add(point(hm + w, vm + h));
break;
case SC_8_3:
positions.add(point(-hm - w, -vm - h));
positions.add(point(0, -vm - h));
positions.add(point(hm + w, -vm - h));
positions.add(point(-hm - w, 0));
positions.add(point(hm + w, 0));
positions.add(point(-hm - w, vm + h));
positions.add(point(0, vm + h));
positions.add(point(hm + w, vm + h));
break;
case SC_8_4:
positions.add(point(0, -vm * 2 - h * 2));
positions.add(point(hm / 2 + w / 2, -vm - h));
positions.add(point(hm + w, 0));
positions.add(point(hm / 2 + w / 2, vm + h));
positions.add(point(0, vm * 2 + h * 2));
positions.add(point(-hm / 2 - w / 2, vm + h));
positions.add(point(-hm - w, 0));
positions.add(point(-hm / 2 - w / 2, -vm - h));
break;
case SC_8_5:
positions.add(point(0, -vm - h));
positions.add(point(hm + w, -vm / 2 - h / 2));
positions.add(point(hm * 2 + w * 2, 0));
positions.add(point(hm + w, vm / 2 + h / 2));
positions.add(point(0, vm + h));
positions.add(point(-hm - w, vm / 2 + h / 2));
positions.add(point(-hm * 2 - w * 2, 0));
positions.add(point(-hm - w, -vm / 2 - h / 2));
break;
case SC_8_6:
positions.add(point(-hm * 3 / 2 - 3 * w / 2, -vm / 2 - h / 2));
positions.add(point(-hm / 2 - w / 2, -vm / 2 - h / 2));
positions.add(point(hm / 2 + w / 2, -vm / 2 - h / 2));
positions.add(point(hm * 3 / 2 + 3 * w / 2, -vm / 2 - h / 2));
positions.add(point(-hm * 3 / 2 - 3 * w / 2, vm / 2 + h / 2));
positions.add(point(-hm / 2 - w / 2, vm / 2 + h / 2));
positions.add(point(hm / 2 + w / 2, vm / 2 + h / 2));
positions.add(point(hm * 3 / 2 + 3 * w / 2, vm / 2 + h / 2));
break;
case SC_8_7:
positions.add(point(-hm / 2 - w / 2, -vm * 3 / 2 - 3 * h / 2));
positions.add(point(hm / 2 + w / 2, -vm * 3 / 2 - 3 * h / 2));
positions.add(point(-hm / 2 - w / 2, -vm / 2 - h / 2));
positions.add(point(hm / 2 + w / 2, -vm / 2 - h / 2));
positions.add(point(-hm / 2 - w / 2, vm / 2 + h / 2));
positions.add(point(hm / 2 + w / 2, vm / 2 + h / 2));
positions.add(point(-hm / 2 - w / 2, vm * 3 / 2 + 3 * h / 2));
positions.add(point(hm / 2 + w / 2, vm * 3 / 2 + 3 * h / 2));
break;
case SC_9_1:
positions.add(point(-hm - w, -vm - h));
positions.add(point(0, -vm - h));
positions.add(point(hm + w, -vm - h));
positions.add(point(-hm - w, 0));
positions.add(point(0, 0));
positions.add(point(hm + w, 0));
positions.add(point(-hm - w, vm + h));
positions.add(point(0, vm + h));
positions.add(point(hm + w, vm + h));
break;
case SC_9_2:
positions.add(point(0, -vm * 2 - h * 2));
positions.add(point(hm / 2 + w / 2, -vm - h));
positions.add(point(hm + w, 0));
positions.add(point(hm / 2 + w / 2, vm + h));
positions.add(point(0, vm * 2 + h * 2));
positions.add(point(-hm / 2 - w / 2, vm + h));
positions.add(point(-hm - w, 0));
positions.add(point(-hm / 2 - w / 2, -vm - h));
positions.add(point(0, 0));
break;
case SC_9_3:
positions.add(point(0, -vm - h));
positions.add(point(hm + w, -vm / 2 - h / 2));
positions.add(point(hm * 2 + w * 2, 0));
positions.add(point(hm + w, vm / 2 + h / 2));
positions.add(point(0, vm + h));
positions.add(point(-hm - w, vm / 2 + h / 2));
positions.add(point(-hm * 2 - w * 2, 0));
positions.add(point(-hm - w, -vm / 2 - h / 2));
positions.add(point(0, 0));
break;
}
switch (placeEnum) {
case SC_3_3:
adjustOffset(positions, 0, calculateYOffsetToCenter(hm, vm, w, h));
break;
case SC_3_4:
adjustOffset(positions, 0, -calculateYOffsetToCenter(hm, vm, w, h));
break;
case SC_4_2:
case SC_5_1:
case SC_5_2:
case SC_5_3:
case SC_5_4:
case SC_6_1:
case SC_6_2:
case SC_6_3:
case SC_6_4:
case SC_6_5:
case SC_6_6:
case SC_7_1:
case SC_7_2:
case SC_7_3:
case SC_7_4:
case SC_7_5:
case SC_7_6:
case SC_8_1:
case SC_8_2:
case SC_8_3:
case SC_8_4:
case SC_8_5:
case SC_8_6:
case SC_8_7:
case SC_9_1:
case SC_9_2:
case SC_9_3:
adjustOffset(positions, 0, (h - w) / 2);
break;
}
calculatePositionsInParent(positions, parentSize);
calculateOffset(
positions,
alignmentEnum,
parentSize,
w,
h,
buttonTopMargin,
buttonBottomMargin,
buttonLeftMargin,
buttonRightMargin);
return positions;
}
public static ArrayList<Point> getHamButtonPositions(ButtonPlaceEnum placeEnum,
ButtonPlaceAlignmentEnum alignmentEnum,
Point parentSize,
float buttonWidth,
float buttonHeight,
int buttonNumber,
float buttonHorizontalMargin,
float buttonVerticalMargin,
float buttonTopMargin,
float buttonBottomMargin,
float buttonLeftMargin,
float buttonRightMargin,
Float bottomHamButtonTopMargin) {
ArrayList<Point> positions = new ArrayList<>(buttonNumber);
float w = buttonWidth, h = buttonHeight;
float hm = buttonHorizontalMargin, vm = buttonVerticalMargin;
int half = buttonNumber / 2;
switch (placeEnum) {
case Horizontal:
if (buttonNumber % 2 == 0) {
for (int i = half - 1; i >= 0; i--)
positions.add(point(-w / 2 - hm / 2 - i * (w + hm), 0));
for (int i = 0; i < half; i++)
positions.add(point(w / 2 + hm / 2 + i * (w + hm), 0));
} else {
for (int i = half - 1; i >= 0; i--)
positions.add(point(-w - hm - i * (w + hm), 0));
positions.add(point(0, 0));
for (int i = 0; i < half; i++) positions.add(point(w + hm + i * (w + hm), 0));
}
break;
case Vertical:
case HAM_1:
case HAM_2:
case HAM_3:
case HAM_4:
case HAM_5:
case HAM_6:
if (buttonNumber % 2 == 0) {
for (int i = half - 1; i >= 0; i--) positions.add(point(0, -h / 2 - vm / 2 - i * (h + vm)));
for (int i = 0; i < half; i++) positions.add(point(0, h / 2 + vm / 2 + i * (h + vm)));
} else {
for (int i = half - 1; i >= 0; i--) positions.add(point(0, -h - vm - i * (h + vm)));
positions.add(point(0, 0));
for (int i = 0; i < half; i++) positions.add(point(0, h + vm + i * (h + vm)));
}
if (buttonNumber >= 2 && bottomHamButtonTopMargin != null)
positions.get(positions.size() - 1).offset(0, (int) (bottomHamButtonTopMargin - vm));
break;
}
calculatePositionsInParent(positions, parentSize);
calculateOffset(
positions,
alignmentEnum,
parentSize,
w,
h,
buttonTopMargin,
buttonBottomMargin,
buttonLeftMargin,
buttonRightMargin);
return positions;
}
private static void calculatePositionsInParent(ArrayList<Point> positions,
Point parentSize) {
for (int i = 0; i < positions.size(); i++) {
Point point = positions.get(i);
positions.set(i, new Point(
(int) (point.x + parentSize.x / 2.0),
(int) (point.y + parentSize.y / 2.0)));
}
}
private static float calculateYOffsetToCenter(float horizontalMargin,
float verticalMargin,
float width,
float height) {
return (horizontalMargin / 2 + width / 2) * (horizontalMargin / 2 + width / 2) / (verticalMargin + height);
}
private static void adjustOffset(ArrayList<Point> position, float x, float y) {
for (int i = 0; i < position.size(); i++) {
position.set(i, point(position.get(i).x + x, position.get(i).y + y));
}
}
private static void calculateOffset(ArrayList<Point> positions,
ButtonPlaceAlignmentEnum alignmentEnum,
Point parentSize,
float width,
float height,
float buttonTopMargin,
float buttonBottomMargin,
float buttonLeftMargin,
float buttonRightMargin) {
int minHeight = Integer.MAX_VALUE;
int maxHeight = Integer.MIN_VALUE;
int minWidth = Integer.MAX_VALUE;
int maxWidth = Integer.MIN_VALUE;
Point offset = new Point(0, 0);
for (Point position : positions) {
maxHeight = Math.max(maxHeight, position.y);
minHeight = Math.min(minHeight, position.y);
maxWidth = Math.max(maxWidth, position.x);
minWidth = Math.min(minWidth, position.x);
}
switch (alignmentEnum) {
case Center:
break;
case Top:
offset.y = (int) (height / 2 + buttonTopMargin - minHeight);
break;
case Bottom:
offset.y = (int) (parentSize.y - height / 2 - maxHeight - buttonBottomMargin);
break;
case Left:
offset.x = (int) (width / 2 + buttonLeftMargin - minWidth);
break;
case Right:
offset.x = (int) (parentSize.x - width / 2 - maxWidth - buttonRightMargin);
break;
case TL:
offset.y = (int) (height / 2 + buttonTopMargin - minHeight);
offset.x = (int) (width / 2 + buttonLeftMargin - minWidth);
break;
case TR:
offset.y = (int) (height / 2 + buttonTopMargin - minHeight);
offset.x = (int) (parentSize.x - width / 2 - maxWidth - buttonRightMargin);
break;
case BL:
offset.y = (int) (parentSize.y - height / 2 - maxHeight - buttonBottomMargin);
offset.x = (int) (width / 2 + buttonLeftMargin - minWidth);
break;
case BR:
offset.y = (int) (parentSize.y - height / 2 - maxHeight - buttonBottomMargin);
offset.x = (int) (parentSize.x - width / 2 - maxWidth - buttonRightMargin);
break;
case Unknown:
throw new RuntimeException("Unknown button-place-alignment-enum!");
}
for (int i = 0; i < positions.size(); i++) {
Point position = positions.get(i);
positions.set(i, new Point(position.x + offset.x, position.y + offset.y));
}
}
private static Point point(float x, float y) {
return new Point((int) x, (int) y);
}
private static Point point(double x, double y) {
return new Point((int) x, (int) y);
}
private static Point point(int x, int y) {
return new Point(x, y);
}
private static ButtonPlaceManager ourInstance = new ButtonPlaceManager();
public static ButtonPlaceManager getInstance() {
return ourInstance;
}
private ButtonPlaceManager() {
}
}