public class SetIntervals extends AppCompatActivity { SeekBar seekBar1, seekBar2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_set_intervals); seekBar1=(SeekBar)findViewById(R.id.seekBar1); seekBar2=(SeekBar)findViewById(R.id.seekBar2); seekBar1.setMax(10); seekBar1.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){ @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { System.out.println(i); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); } }Lo scatto si ha a ognuno dei 10.
Ora lo graduo a 5.
seekBar1.setMax(5); seekBar1.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){ @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { System.out.println(i); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } });E vediamo...
Adesso scatta a ognuno dei 5.
Ora, io voglio un massimo di 4 ore, che sarebbe 240 minuti, regolabile a valori di 10 minuti.
Se per ogni valore voglio lo scatto, devo far sì che corrisponda nella scala della SeekBar a 1.
Come fare?
In 240 minuti ci sono 24 intervalli di 10 minuti, quindi dovrei graduare a 24.
Proviamo per vedere la "manualità":
seekBar1.setMax(24); seekBar1.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){ @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { System.out.println(i); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } });Non è molto "acchiappabile" come prima, ovviamente. Ma ha senso che io imposti un intervallo di 4 ore? Posso impostarlo di 3?
Vediamo:
seekBar1.setMax(18);Va bene, dai, lasciamolo così: a intervalli di 3 ore l'app mi chiede conto di quello che sto facendo.
Il valore sarà il numero dello scatto moltiplicato per 10.
Cosa dovrò riportare nella relativa textView?
Ecco: istanzio le textView e vado:
seekBar1.setMax(18); seekBar1.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){ @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { textViewMin.setText(""+i*10); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } });Ecco: ottengo il numero di minuti desiderato.
Dal momento che sarebbe ridicolo impostare un intervallo zero, sarebbe il caso di iniziare con un intervallo di 10 minuti.
Dunque bisogna sommare al valore 10, e impostare il Max a 170 (dieci minuti in meno), in modo che nella textView venga un valore da 10 a 180 minuti.
seekBar1.setMax(17); seekBar1.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){ @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { textViewMin.setText(""+i*10+10); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } });Proviamo... Perfetto! Abbiamo il valore dei minuti da 10 a 180.
Ora devo occuparmi della conversione di questo valore in ore.
Per la conversione in ore:
seekBar1.setMax(17); seekBar1.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){ @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { int ore=(i*10+10)/60. textViewMin.setText(""+ore); }Proviamo...
Sì: ho creato il tutto:
seekBar1.setMax(17); seekBar1.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){ @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { int ore=(i*10+10)/60; int minuti=(i*10+10)%60; textViewMin.setText(ore+" ore e "+minuti+" minuti"); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } });Posso raffinare il risultato omettendo ore e minuti qualora siano zero... ma per il momento facciamo altro: sistemo l'altra SeekBar e poi le devo coordinare.
seekBar1.setMax(17); seekBar2.setMax(17); seekBar1.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){ @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { int ore=(i*10+10)/60; int minuti=(i*10+10)%60; textViewMin.setText(ore+" ore e "+minuti+" minuti"); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); seekBar2.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){ @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { int ore2=(i*10+10)/60; int minuti2=(i*10+10)%60; textViewMax.setText(ore+" ore e "+minuti+" minuti"); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } });Proviamolo...
Funziona!
Ora viene il coordinamento, perché la barra che stabilisce l'intervallo massimo non può avere un valore inferiore a quella dell'intervallo minimo, e viceversa.
Ogni volta che si muove una barra, bisognerà, se è il caso, aggiustare l'altra.
Vediamo come si può fare...
Ecco il codice che riporta la seekBar2 a valori di progress uguali a quelli della seekBar1 qualora fossero minori:
if(seekBar2.getProgress()<i) seekBar2.setProgress(i);
Ora facciamo il reciproco con seekBar2 qualora il valore di seekBar1 fosse superiore:
if(seekBar1.getProgress()>i) seekBar1.setProgress(i);Proviamo...
Okay! Funziona!
Nessun commento:
Posta un commento