¿Cómo dejar de desplazarse en un widget de la galería?

Cargué algunas imágenes en una galería. Ahora puedo desplazarme pero una vez que comencé a desplazarme, el desplazamiento no se detiene. Me gustaría que la galería simplemente se desplace a la siguiente imagen y luego se detenga hasta que el usuario vuelva a hacer el gesto de desplazamiento.

este es mi código

import android.widget.ImageView; import android.widget.Toast; import android.widget.AdapterView.OnItemClickListener; public class GalleryExample extends Activity { private Gallery gallery; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); gallery = (Gallery) findViewById(R.id.examplegallery); gallery.setAdapter(new AddImgAdp(this)); gallery.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView parent, View v, int position, long id) { Toast.makeText(GalleryExample.this, "Position=" + position, Toast.LENGTH_SHORT).show(); } }); } public class AddImgAdp extends BaseAdapter { int GalItemBg; private Context cont; private Integer[] Imgid = { R.drawable.a_1, R.drawable.a_2, R.drawable.a_3, R.drawable.a_4, R.drawable.a_5, R.drawable.a_6, R.drawable.a_7 }; public AddImgAdp(Context c) { cont = c; TypedArray typArray = obtainStyledAttributes(R.styleable.GalleryTheme); GalItemBg = typArray.getResourceId(R.styleable.GalleryTheme_android_galleryItemBackground, 0); typArray.recycle(); } public int getCount() { return Imgid.length; } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { ImageView imgView = new ImageView(cont); imgView.setImageResource(Imgid[position]); i.setScaleType(ImageView.ScaleType.FIT_CENTER); imgView.setBackgroundResource(GalItemBg); return imgView; } } 

}

y el archivo xmlLayout

     

Creo que encontré una manera de lograr desplazarse solo 1 vista por página en la galería y poder tener una longitud de barrido mínima para activar la animación.

Sustituya el método onFling del widget de galería y, en lugar de llamar a super.onFling, verifique si el deslizamiento fue de izquierda a derecha o de derecha a izquierda y llame al evento dpad apropiado como se muestra a continuación:

 private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2){ return e2.getX() > e1.getX(); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY){ int kEvent; if(isScrollingLeft(e1, e2)){ //Check if scrolling left kEvent = KeyEvent.KEYCODE_DPAD_LEFT; } else{ //Otherwise scrolling right kEvent = KeyEvent.KEYCODE_DPAD_RIGHT; } onKeyDown(kEvent, null); return true; } 

Este es el código que funcionó para mí.

La solución de Nadewad + algunos ajustes de velocidad de animación:

Cree una clase que amplíe Gallery y anule este método:

  @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { setAnimationDuration(600); return super.onScroll(e1, e2, distanceX, distanceY); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { float velMax = 2500f; float velMin = 1000f; float velX = Math.abs(velocityX); if (velX > velMax) { velX = velMax; } else if (velX < velMin) { velX = velMin; } velX -= 600; int k = 500000; int speed = (int) Math.floor(1f / velX * k); setAnimationDuration(speed); int kEvent; if (isScrollingLeft(e1, e2)) { // Check if scrolling left kEvent = KeyEvent.KEYCODE_DPAD_LEFT; } else { // Otherwise scrolling right kEvent = KeyEvent.KEYCODE_DPAD_RIGHT; } onKeyDown(kEvent, null); return true; } 

¡Disfrutar!

La manera fácil es seguir:

 @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return super.onFling(e1, e2, 0, velocityY); } 

También puede consultar aquí: Android Infinite Loop Gallery

La manera más fácil que he encontrado para lograr esto es anulando el método Gallery onFling y proporcionando mi propio valor de velocidadX:

 @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return super.onFling(e1, e2, 10, velocityY); } 

No es perfecto, pero cumple su función. Idealmente, probablemente escribiría algo personalizado para onFling para que funcione exactamente como lo desee.

Encontré la siguiente anulación onFling funcionó bastante bien para pequeños deslizamientos y paginación de una sola página:

 @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { boolean leftScroll = isScrollingLeft(e1, e2); float velX; if(leftScroll) { velX=500; } else { velX=-500; } return super.onFling(e1, e2, velX, velocityY); } 

El valor de velX + -500 parece proporcionar un resultado lo suficientemente bueno, pero podría ajustarse para adaptarse a sus preferencias.

(Nota: esto es usando el método isScrollingLeft presentado en la respuesta de @ Nadewad )

no hay necesidad de hacer nada simplemente devuelva falso

 private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2){ return e2.getX() > e1.getX(); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY){ return false; } 

funcionó para mí

¡¡¡GRACIAS A DIOS!!! Dios mío, ¡literalmente conecté esto en algún código y funcionó! ugh, 48 horas seguidas y pensar que solo tenía que hacer la búsqueda de Google perfecta para mi respuesta. Literalmente, plug and play. Muchas gracias.

nuevo código

 public class CustomGallery extends Gallery { public CustomGallery(Context context) { super(context); } public CustomGallery(Context context, AttributeSet attrs) { super(context, attrs); } public CustomGallery(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2){ return e2.getX() > e1.getX(); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY){ int kEvent; if(isScrollingLeft(e1, e2)){ //Check if scrolling left kEvent = KeyEvent.KEYCODE_DPAD_LEFT; } else{ //Otherwise scrolling right kEvent = KeyEvent.KEYCODE_DPAD_RIGHT; } onKeyDown(kEvent, null); return true; } } 

código antiguo: solo para fines de comparación

  public class CustomGallery extends Gallery { public CustomGallery(Context context) { super(context); } public CustomGallery(Context context, AttributeSet attrs) { super(context, attrs); } public CustomGallery(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { //Do something specific here. return super.onScroll(e1, e2, distanceX, distanceY); } }