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.

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:

  1. Resolver la función getThumb() que sólo puede utilizar por encima de los problemas de la API 16.
  2. 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); } } 
  • Seekbar para dos valores
  • ¿Cómo puedo obtener un SeekBar vertical de trabajo en Android?
  • Establecer el color de progreso de SeekBar a transparente
  • Seekbar en android no se mueve automáticamente
  • Android buscador recortado pulgar
  • Obtener progreso en onStopTrackingTouch no onProgressChanged en seekbar
  • Android SeekBar volteado horizontalmente
  • Android - Cómo marcar marcas de tiempo en un SeekBar
  • Android SeekBar no se actualiza después de establecer dinámicamente el valor máximo con setMax
  • Android SeekBar marca dónde están los valores
  • Android barra de búsqueda para controlador de audio
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.