Cómo hacer que se deslice para desbloquear el botón en android

Hola quiero un botón que debe funcionar como 'diapositiva para desbloquear' botón de IOS

En pocas palabras quiero un botón que no tiene efecto de clic pero puede deslizar de izquierda a derecha mientras arrastrar y en la conclusión de arrastrar debería considerar clic.

Por favor, me sugiero cualquier código de ejemplo si es posible.

¡Gracias!

En primer lugar me gustaría dar las gracias a @matthias por su respuesta. He utilizado la siguiente barra de búsqueda con un poco de personalización:

<SeekBar android:id="@+id/myseek" android:layout_width="fill_parent" android:layout_height="wrap_content" android:clickable="false" android:max="100" android:progressDrawable="@android:color/transparent" android:thumb="@drawable/ic_launcher" /> 

Y en código java

 sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { if (seekBar.getProgress() > 95) { } else { seekBar.setThumb(getResources().getDrawable(R.drawable.ic_launcher)); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if(progress>95){ seekBar.setThumb(getResources().getDrawable(R.drawable.load_img1)); } } }); 

Comencé con el ejemplo que Jignesh Ansodariya publicó, pero como Aerrow señala, el usuario puede hacer clic en cualquier lugar en el SeekBar para desbloquear. Eso hace que sea bastante inutilizable, ya que el punto de tener un botón deslizante es que los clics accidentales deben ser ignorados. Mi solución fue crear una subclase de SeekBar, como esto:

 public class SlideButton extends SeekBar { private Drawable thumb; private SlideButtonListener listener; public SlideButton(Context context, AttributeSet attrs) { super(context, attrs); } @Override public void setThumb(Drawable thumb) { super.setThumb(thumb); this.thumb = thumb; } @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { if (thumb.getBounds().contains((int) event.getX(), (int) event.getY())) { super.onTouchEvent(event); } else return false; } else if (event.getAction() == MotionEvent.ACTION_UP) { if (getProgress() > 70) handleSlide(); setProgress(0); } else super.onTouchEvent(event); return true; } private void handleSlide() { listener.handleSlide(); } public void setSlideButtonListener(SlideButtonListener listener) { this.listener = listener; } } public interface SlideButtonListener { public void handleSlide(); } 

XML:

  <package.SlideButton android:id="@+id/unlockButton" android:layout_width="match_parent" android:layout_height="wrap_content" android:clickable="false" android:max="100" android:progressDrawable="@android:color/transparent" android:thumb="@drawable/button_lock" > </package.SlideButton> 

Y finalmente el código dentro de mi Actividad:

  ((SlideButton) findViewById(R.id.unlockButton)).setSlideButtonListener(new SlideButtonListener() { @Override public void handleSlide() { unlockScreen(); } }); 

Android proporciona el widget Switch que es similar a la diapositiva para desbloquear . Sin embargo, tendrá que personalizar un poco, por ejemplo, deshabilitar el cambio en hacer clic.

Por alguna razón, no pude desactivar la acción táctil para que los golpes accidentales todavía son posibles
Me surgió con esta solución, que básicamente no permitirá cambiar el progreso de más de 10 valores por evento de cambio

 int unlockLastSeekVal = 0; // there are skips btwn changes, use value greater than 1 // 10 is great for seekbars with 100 values int unlockSeekSensitivity = 10; // final stage to "unlock"; 0.9 => 90% Double unlockFinalStage = 0.9; //........... unlock.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser){ if (Math.abs(unlockLastSeekVal - progress) > unlockSeekSensitivity){ // too much delta, revert to last value seekBar.setProgress(unlockLastSeekVal); }else{ unlockLastSeekVal = progress; } } } public void onStartTrackingTouch(SeekBar seekBar) { } public void onStopTrackingTouch(SeekBar seekBar) { if (seekBar.getProgress() > seekBar.getMax() * unlockFinalStage){ DoYourThing(); } unlockLastSeekVal = 0; seekBar.setProgress(0); } }); 

A partir de la respuesta de Oskar (gracias por tu contribución) Creo un proyecto de ejemplo simple para administrar el botón de diapositiva (horizontal y vertical): https://github.com/rcaboni/AndroidSlideButton

Para una captura de pantalla: https://raw.githubusercontent.com/rcaboni/AndroidSlideButton/master/screenshot.jpg

Este es el método principal:

 public boolean onTouchEvent(MotionEvent event) { if (!isEnabled()) { return false; } if (orientation == ORIENTATION_HORIZONTAL) { if (event.getAction() == MotionEvent.ACTION_DOWN) { int x= (int) event.getX(); int y= (int) event.getY(); if (thumb.getBounds().contains((int) event.getX(), (int) event.getY())) { super.onTouchEvent(event); } else return false; } else if (event.getAction() == MotionEvent.ACTION_UP) { if (getProgress() > 70) handleSlide(); setProgress(0); } else super.onTouchEvent(event); }else{ int i=0; switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (event.getAction() == MotionEvent.ACTION_DOWN) { int x= (int) event.getX(); int y= (int) event.getY(); if (!thumb.getBounds().contains((int) event.getY(), (int) event.getX())) { return false; } } case MotionEvent.ACTION_MOVE: i=getMax() - (int) (getMax() * event.getY() / getHeight()); setProgress(100 - i); onSizeChanged(getWidth(), getHeight(), 0, 0); break; case MotionEvent.ACTION_UP: i=getMax() - (int) (getMax() * event.getY() / getHeight()); if (i < 30) { handleSlide(); } setProgress(0); onSizeChanged(getWidth(), getHeight(), 0, 0); break; case MotionEvent.ACTION_CANCEL: break; } } return true; } 

XML para el botón vertical:

 <RelativeLayout android:layout_width="75dp" android:layout_height="130dp" android:background="@drawable/slide_background_green" android:id="@+id/lSlideButtonV" android:layout_below="@+id/lSlideButton" android:layout_marginTop="50dp"> <TextView android:layout_width="20dp" android:layout_height="match_parent" android:text="SOS" android:id="@+id/tvSlideActionV" android:gravity="center|bottom" android:layout_alignParentRight="false" android:layout_alignParentEnd="false" android:layout_alignParentLeft="false" android:layout_alignParentStart="false" android:textSize="20dp" android:textColor="@android:color/white" android:layout_alignParentTop="false" android:layout_centerHorizontal="true" android:layout_alignParentBottom="false" android:layout_marginBottom="15dp" /> <it.aldea.android.widget.SlideButton android:id="@+id/unlockButtonV" android:layout_width="match_parent" android:layout_height="150dp" android:clickable="false" android:max="100" slideButton:orientation="vertical" android:progressDrawable="@android:color/transparent" android:thumb="@drawable/slide_track_red" android:indeterminate="false" android:layout_marginRight="5dp" android:layout_marginTop="20dp" android:layout_centerInParent="true" android:layout_marginBottom="10dp" android:thumbOffset="-2dp"> </it.aldea.android.widget.SlideButton> </RelativeLayout> 

No es un widget real completo porque se compone de dos vistas (TextView y SlideButton) en un Layout, pero es una solución fácil de configurar para Slide Button con texto dentro. Espero que esto sea útil para alguien.

Tal vez muy tarde, pero he creado una pequeña biblioteca para este propósito. Le permite deslizar y personalizar el comportamiento de su botón de xml. Botón deslizante

Básicamente implica la anulación del evento onTouch () y la realización de cambios de acuerdo con las coordenadas que se reciben. Su una cosa simple después de eso para fijar el fondo mientras que usted quiere y modifica el texto para requisitos particulares.

Puede utilizar esta biblioteca para personalizar su desbloqueo de forma rápida y sencilla.

https://github.com/cheekiat/SlideToUnlock

Utilice este código en xml

  <cheekiat.slideview.SlideView android:id="@+id/slide_view" android:layout_width="match_parent" android:layout_height="wrap_content" app:slideBackground="@drawable/orangesquarebutton" app:slideSrc="@drawable/slide_image" app:slideText="Slide to unlock" app:slideTextColor="#ffffff" app:slideTextSize="10dp" /> 

Deslice para desbloquear la pantalla

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.