Ich möchte ein anklickbares Ereignis auf dem Suchbalken-Daumen registrieren, um ein Ereignis auszulösen, wenn der Benutzer es geklickt hat. Ist es möglich?Seekbars Daumen auf Klick
Antwort
Ich mache es so:
pagesSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { //listener
@Override
public void onStopTrackingTouch(final SeekBar seekBar) {
//add your event here
}
@Override
public void onStartTrackingTouch(final SeekBar seekBar) {
}
@Override
public void onProgressChanged(final SeekBar seekBar, final int progress, final boolean fromUser) {
updateControls(progress, false);
}
});
Ich möchte nur in den Daumen klicken können. Dieser Zuhörer wird ausgelöst, indem er in jeden Teil der Suchleiste klickt. – biquillo
Ich konnte dies in der folgenden Art und Weise erreichen:
seekBar.setOnTouchListener(new OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
if(event.getAction() == MotionEvent.ACTION_MOVE)
{
changedPosition = true;
seekBar.setProgress(seekBar.getProgress());
return false;
}
else if (event.getAction() == MotionEvent.ACTION_UP)
{
if(!changedPosition)
{
//do action here
}
}
}
hoffe, das hilft
Dies würde auf Berührungsereignisse auf der gesamten Suchleiste hören, anstatt nur auf den Daumen. – Prateek
Prateek hat recht, das wird auch ausgelöst, wenn Sie sich über andere Teile der Suchleiste bewegen. –
@ BjörnKechel während es wahr ist, dass dies Touch-Ereignisse auf alle Suchleiste hört, aber wenn Sie es anderswo als den Daumen berühren würde dann die ACTION_MOVE ausgelöst werden und in ACTION_UP nichts passieren würde, dank der if-Anweisung. – zwebie
Kombination zwebie und Nermeens Antworten auf die richtige Lösung:
seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
private int mProgressAtStartTracking;
private final int SENSITIVITY;
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
// handle progress change
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
mProgressAtStartTracking = seekBar.getProgress();
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
if(Math.abs(mProgressAtStartTracking - seekBar.getProgress()) <= SENSITIVITY){
// react to thumb click
}
}
});
Also feuert das wirklich nur auf Daumenklick, nicht auf Daumen bewegen und nicht auf andere Teile der Suchleiste klicken.
Sie können die Empfindlichkeit anpassen, da manchmal ein Klick den Daumen ein wenig bewegt und kleine Änderungen erlaubt, während das Klicken immer noch weniger frustrierend ist. Ein guter Wert hängt hier von der Größe der Suchleiste und dem maximalen Wert ab, den sie haben kann. Für mich funktionierte 3 gut auf einer vollen Suchleiste mit maximal 50 auf einem Porträt-Layout.
@ wer auch immer herunterfährt: Bitte lass mich wissen, was du mit meiner Antwort falsch findest. Es funktioniert besser als die anderen beiden Antworten. –
Danke, funktioniert gut für mich, obwohl ich nicht weiß, warum jemand abstimmte – Vicky
Ich habe Bijoms Antwort als Inspiration verwendet. Dies wird ausgelöst, wenn sich der Daumen bewegt. Wenn der Benutzer nicht auf den Daumen klickt, wird er sich nicht bewegen. Hoffe das hilft. :)
Wenn Sie Fragen dazu haben, wie es funktioniert, fühlen Sie sich frei zu kommentieren.
mSeekBarSpeed.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
int progress = mSeekBarSpeed.getProgress();
boolean started = false; //use this variable to see whether the user clicked the right place
@Override
public void onProgressChanged(SeekBar seekBar, int progressValue, boolean fromUser) {
if(!started){ //check to see if user clicks the right place
//if the user clicks within a specific threshold
float threshold = (float)seekBar.getMax()/seekBar.getWidth() * seekBar.getThumb().getIntrinsicWidth()/2;
if(Math.abs(progressValue - progress) < threshold){
if(fromUser){ //checks if user actually clicked it
started = true;
}
}else{
seekBar.setProgress(progress); //set to original progress
onStopTrackingTouch(seekBar); //not really necessary, keep or delete based on your needs
return; //get out of method
}
}
if(started) {
progress = progressValue; //update progress variable
System.out.println("onProgressChanged:" + progress + "/" + seekBar.getMax());
//DO WHAT YOU NEED TO DO WHEN PROGRESS IS CHANGING
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
System.out.println("onStartTracking:" + progress + "/" + seekBar.getMax());
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
System.out.println("onStopTracking:" + progress + "/" + seekBar.getMax());
//DO WHATEVER YOU NEED TO DO WHEN PROGRESS IS DONE CHANGING
started = false; //remember to set variable to false
}
});
Haben Sie das gelöst? – David