Solución de búsqueda de Android
¿Es posible que la barra de búsqueda se mueva sólo cuando se mueve el pulgar. En este momento la barra de búsqueda se mueve incluso en el toque de dedo en el progresivo. ¿Cómo desactivamos el movimiento de la barra de búsqueda en el toque de dedo de la progresiva?
Gracias.
- Cómo solucionar los problemas de seekbar-bar-thumb-centering
- Actualización en vivo Brillo de la pantalla con SeekBar
- Cómo hacer un SeekBar vertical en Android?
- Cómo obtener el valor de paso seleccionado en android-comboseekbar-master
- ¿Cómo cancelo un movimiento de "arrastrar" en un Seekbar de Android?
- Personalización de SeekBar - cómo colocar correctamente la imagen "pulgar" personalizada?
- SeekBar con valores decimales
- MediaPlayer, ProgressBar
- Cómo establecer el valor mínimo y máximo de búsqueda
- ¿Cómo mostrar algún valor en la barra de búsqueda por defecto?
- Android seekbar con pulgar personalizado con texto dinámico dentro de él
- SeekBar mediante programación
- Custom SeekBar Drawable Android
OnTouchListener
la OnTouchListener
para el buscador y sólo procese el movimiento en el pulgar cuando MotionEvent
es un evento de movimiento.
event.getAction() == MotionEvent.ACTION_MOVE
Actualización: 1
Algo así funcionará, pero la captura es que incluso si el usuario mueve el pulgar 2 unidades de la barra de búsqueda se mueve. Y usted realmente no debe detener este comportamiento ya que se ensucia el the seekbar.
seekBar.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_MOVE){ Log.d(TAG, "Moved , process data, Moved to :" + seekBar.getProgress()); seekBar.setProgress(seekBar.getProgress()); return false; } Log.d(TAG, "Touched , Progress :" + seekBar.getProgress()); return true; } });
Encontré que el problema con la solución de Ravi es que tocar y moverse fuera de la posición actual del pulgar todavía daría lugar a un salto.
La clase a continuación resuelve el problema y reemplaza el salto por toque con un pequeño incremento, igual al que se obtendría con las teclas de flecha.
import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.MotionEvent; import android.widget.SeekBar; /** * A NoSkipSeekBar is an extension of {@link SeekBar} that prevents jumps in position * by touching outside the current thumb position. Such touches are replaced by * an increment or decrement the same as would be achieved using a DPAD's Left or * Right arrow keys. */ public class NoSkipSeekBar extends SeekBar { public NoSkipSeekBar(Context context) { super(context); } public NoSkipSeekBar(Context context, AttributeSet attrs) { super(context, attrs); } public NoSkipSeekBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } private boolean isDragging; private boolean isWithinThumb(MotionEvent event) { return getThumb().getBounds().contains((int)event.getX(), (int)event.getY()); } private void increment(int direction) { if (direction != 0) { final KeyEvent key = new KeyEvent(KeyEvent.ACTION_DOWN, direction < 0 ? KeyEvent.KEYCODE_DPAD_LEFT : KeyEvent.KEYCODE_DPAD_RIGHT); onKeyDown(key.getKeyCode(), key); } } @Override public boolean onTouchEvent(MotionEvent event) { if (!isEnabled() || getThumb() == null) return super.onTouchEvent(event); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (isWithinThumb(event)) { isDragging = true; return super.onTouchEvent(event); } else { return true; } case MotionEvent.ACTION_UP: isDragging = false; if (isWithinThumb(event)) { return super.onTouchEvent(event); } else { final Rect r = getThumb().getBounds(); increment((int)event.getX() - (r.left + r.right) / 2); return true; } case MotionEvent.ACTION_MOVE: if (!isDragging) return true; break; case MotionEvent.ACTION_CANCEL: isDragging = false; break; } return super.onTouchEvent(event); } }
¿Has mirado esto?
Hilo realmente similar que debería ayudarle a resolver su pregunta:
El pulgar de SeekBar sólo aparece cuando se toca
La mejor de las suertes
La solución de Ravi es grande, hice un poco de refactoring abajo:
Dos propósitos:
- Resolver la función
getThumb()
que sólo puede utilizar por encima de los problemas de la API 16. - Al hacer clic en la barra de búsqueda no se invocará el
onStopTrackingTouch()
sino que sólo arrastrará el pulgar
Este es mi código:
public class NoSkipSeekBar extends SeekBar { Drawable mThumb; @Override public void setThumb(Drawable thumb) { super.setThumb(thumb); mThumb = thumb; } public Drawable getSeekBarThumb() { return mThumb; } public NoSkipSeekBar(Context context) { super(context); } public NoSkipSeekBar(Context context, AttributeSet attrs) { super(context, attrs); } public NoSkipSeekBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } private boolean isDragging; private boolean isStart = false; private boolean isWithinThumb(MotionEvent event) { Rect rect = getSeekBarThumb().getBounds();//increate the thumb invoke area Rect rect1 = new Rect(); rect1.left = rect.left - 50; rect1.right = rect.right + 50; rect1.bottom = rect.bottom + 50; return rect1.contains((int)event.getX(), (int)event.getY()); } private void increment(int direction) { if (direction != 0) { final KeyEvent key = new KeyEvent(KeyEvent.ACTION_DOWN, direction < 0 ? KeyEvent.KEYCODE_DPAD_LEFT : KeyEvent.KEYCODE_DPAD_RIGHT); onKeyDown(key.getKeyCode(), key); } } @Override public boolean onTouchEvent(MotionEvent event) { if (!isEnabled() || getSeekBarThumb() == null) return super.onTouchEvent(event); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (isWithinThumb(event)) { isDragging = true; isStart = true; return super.onTouchEvent(event); } else { return true; } case MotionEvent.ACTION_UP: isDragging = false; if(isStart){ isStart = false; return super.onTouchEvent(event); } if (isWithinThumb(event)) { return super.onTouchEvent(event); } else { //final Rect r = getThumb().getBounds(); //increment((int)event.getX() - (r.left + r.right) / 2); return true; } case MotionEvent.ACTION_MOVE: if (!isDragging) return true; break; case MotionEvent.ACTION_CANCEL: isDragging = false; break; } return super.onTouchEvent(event); } }
- Modelo congelado de Keras no predice después de la restauración
- Buen enfoque para reintentar manualmente solicitudes en Retrofit Android