Un sistema che sto costruendo include un set di cursori dell'interfaccia utente (il numero varia) ciascuno con una scala da 0 a 100. Per dispositivo di scorrimento 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 garantisce sempre un totale di 100. Quindi, quando uno slider viene spostato verso l'alto, gli altri si spostano tutti verso il basso, fino 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 sono pari al 100%:
----O------ 40
O---------- 0
--O-------- 20
--O-------- 20
--O-------- 20
Se il primo cursore si sposta su SU da 40 a 70, gli altri devono spostare GIÙ in valore (mentre il cursore viene trascinato). Nota che tre cursori sono passati 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 uno slider raggiunge 0 o 100, non può spostarsi ulteriormente, che è dove la mia testa inizia davvero a ferire. Quindi se un cursore si muove più in alto, gli altri si spostano più in basso, ma quando uno di essi raggiunge lo zero, solo i restanti che non hanno ancora raggiunto lo zero possono spostarsi più in basso.
Lo chiedo 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 la mia prima pugnalata è stato quello di calcolare la variazione percentuale del cursore che si muoveva. Ho quindi diviso quella modifica e l'ho applicata (nell'altra direzione) agli altri valori del cursore. Il problema però è che usando percentuali e moltiplicando, se un qualsiasi cursore arriva a zero, non può mai essere aumentato di nuovo da zero - il risultato netto di ciò è che i singoli cursori rimangono bloccati a zero. Ho usato gli slider 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.