Dividendo un intervallo uniformemente, consentendo spazi e margini
Domanda
Ho un array di punti e un pannello. getWidth()
si basa sul pannello. Immagina le carte in mano, quindi HAND_CARD_WIDTH
è piuttosto autoesplicativo. Lo scopo di questo ciclo è di impostare i punti uniformemente attraverso il pannello, cosa che fa. Tuttavia, consente alle carte di uscire dal pannello, il che lo rende molto male. Quello che voglio fare è dare un piccolo margine vuoto su entrambi i lati del pannello, non importa quante carte hai in mano.
Ecco il codice
int iteration = 1;
int limiter = getWidth();
int slice = (limiter/(handsize+1));
while (points.size() < handsize) {
int x = slice*(iteration++);
x -= HAND_CARD_WIDTH/2;
points.add(new Point(x, y));
}
Fondamentalmente voglio il più a sinistra x
Per essere almeno 20
E il più giusto per essere al massimo getWidth() - 20 - HAND_CARD_WIDTH
. Voglio anche che le carte siano uniformemente distanziate ... Non riesco proprio a pensare all'equazione giusta (arrivare a questo punto è stato purtroppo un'impresa ...).
Grazie, in base alle risposte (tutte e 2) ecco cosa sono andato:
if((int)points.get(0).getX() < margin){
int boost = Math.abs(margin - (int)points.get(0).getX());
slice = (boost*2)/handsize;
for(Point p : points){
p.x += boost;
boost -= slice;
}
}
Soluzione
Non sono sicuro di capire il tuo layout, ma penso che sia qualcosa del genere:
| Margine | Spazio | Card | Spazio | Card | Spazio | Margine |
o
| Margine | Spazio | Card | Spazio | Margine |
Quindi, il numero di spazi è uno più del numero di carte e la larghezza totale è la larghezza dei componenti meno i margini. componentwidth = numcards x cardwidth + (numcards + 1) x spacewidth Ora è facile calcolare lo spazio necessario che è (ComponentWidth - NumCards X CardWidth) / (numCards + 1) Quindi la posizione sinistra di una carta è LeftMargin + SpaceWidth x CardNum + CardWidth X (CardNum - 1)
È necessario fare attenzione quando lo spazio è negativo, quindi è necessario calcolare quanto le carte devono sovrapporsi.
Altri suggerimenti
Prova questo:
final int MARGIN = 20;
int availableWidth = getWidth() - 2 * MARGIN - HAND_CARD_WIDTH;
int cardSpaceWidth = availableWidth / handsize;
for (int i = 0; i < handsize; i++) {
int x = MARGIN + ((i + 0.5) * cardSpaceWidth) - HAND_CARD_WIDTH / 2;
points.add(new Point(x, y));
}
Così:
- Calcola la larghezza disponibile sottraendo i margini dalla larghezza del pannello totale
- Calcola lo spazio per ogni carta dividendo lo spazio rimanente per numero di carte
- Per ogni carta, contiamo il punto più a sinistra prendendo il centro dello spazio della carta e sottraendo la metà della larghezza della carta.
Intendiamoci, con queste carte di soluzione possono ancora sovrapporre i margini, se HAND_CARD_WIDTH
è maggiore dello spazio disponibile per la carta.