Un sistema che sto costruendo include un set di slider dell'interfaccia utente (il numero varia) ciascuno con una scala da 0 a 100. Per cursore intendo un'interfaccia utente in cui prendi un elemento e trascinalo su e giù, come un controllo del volume. Sono collegati da un algoritmo che assicura che siano sempre 100. Quindi quando un cursore viene spostato verso l'alto, tutti gli altri si spostano verso il basso, eventualmente a zero. Quando uno viene spostato verso il basso, gli altri si spostano verso l'alto. In ogni momento il totale deve essere 100. Quindi qui i cursori hanno vari valori, ma totalizzano il 100%:
----O------ 40
O---------- 0
--O-------- 20
--O-------- 20
--O-------- 20
Se il primo dispositivo di scorrimento si sposta quindi SU da 40 a 70, gli altri devono spostarsi di valore GIÙ (mentre il dispositivo di scorrimento viene trascinato). Nota tre cursori cambiati da 20 a 10 e uno è rimasto a zero in quanto non può scendere.
-------O--- 70
O---------- 0
-O--------- 10
-O--------- 10
-O--------- 10
Ovviamente quando un cursore raggiunge 0 o 100, non può spostarsi oltre, ed è qui che la mia testa inizia davvero a farmi male. Quindi se un cursore si sposta in alto, gli altri si spostano in basso, ma quando uno di essi raggiunge lo zero solo quelli rimanenti che non hanno ancora raggiunto lo zero possono spostarsi in basso.
Sto chiedendo questo qui in quanto questa domanda è specifica dell'algoritmo e non dell'implementazione. FWIW la piattaforma è Android Java, ma non è particolarmente rilevante.
L'approccio che ho seguito con il mio primo colpo è stato quello di calcolare la variazione percentuale del cursore che si muoveva. Ho quindi diviso quel cambiamento e l'ho applicato (nell'altra direzione) agli altri valori del cursore. Il problema però è che usando le percentuali e moltiplicando, se uno slider arriva a zero, non può mai essere aumentato di nuovo da zero - il risultato netto è che i singoli slider rimangono bloccati a zero. Ho usato cursori con un intervallo compreso tra 0 e 1.000.000 per evitare problemi di arrotondamento e questo sembra essere utile, ma devo ancora creare un algoritmo che gestisca bene tutti gli scenari.