2010-08-03 12 views
9

Estoy usando un diseño de galería en mi aplicación. Está funcionando cuando el usuario mueve las imágenes de la galería de izquierda a derecha (es infinito, lo que significa que los elementos se repiten de nuevo). Pero cuando el usuario se mueve de derecha a izquierda y alcanza el primer elemento, no lo hace. Después de eso, no vienen elementos. Pero también quiero repetir elementos de este lado. ¿Puedes darme algunas sugerencias?¿Cómo implementar una galería sin fin en Android?

Gallery g = (Gallery) findViewById(R.id.gallery); 
     g.setAdapter(new ImageAdapter(this)); 
     g.setFocusable(true); 
     g.setSelection((int)(Integer.MAX_VALUE/2) - (Integer.MAX_VALUE/2)% mImageIds.length);   
     g.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View v, int position, long id) 
      { 
       try { 
        imageid=position; 
        ((ImageView)findViewById(R.id.ImageViewlarge)).setImageResource(mImageIds[position]); 
        ((TextView)findViewById(R.id.TextViewImageName)).setText(imgNames[position]); 
        mp = MediaPlayer.create(SeaSpell.this,audioTrack[position]); 

         } catch (Exception e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } 

       } 
      }); 


     } 

Screenshot Frontgallery

¿Cómo puedo hacer mi galería circular vista? Puedo hacerlo de izquierda a derecha infinitamente, pero cuando lo arrastro de derecha a izquierda muestra el punto final.

Respuesta

17

En getView:

if(position>21){ 
    position=0; 
} 

este debe ser eliminado, ya que debe ser manejado por la función checkPosition.

En checkPosition:

Para el operador de módulo (%), dada a % b si 0 <= a < b entonces el resultado será a. Para b <= a < 2*b, el resultado será a-b, por lo que si b == a, el resultado es 0. Esto continúa para cualquier número entero positivo, por lo que el cheque debe ser:

if (position > 0) 
    position = position % mImageIds.length; 

Ahora, lo que le falta de esta está manejando el caso en que position < 0.

a a%3 a a%3 f(a) 
0 0  0 0  0 
1 1  -1 -1  2 
2 2  -2 -2  1 
3 0  -3 0  0 
4 1  -4 -1  2 
5 2  -5 -2  1 
6 0  -6 0  0 

Lo que queremos en este caso es para que se envuelva de nuevo hacia el final de la lista - la f(a) en la tabla anterior.

Como se puede ver en la tabla anterior, si a es negativo, entonces -b < a <= 0. Además, si hacemos f(a) = (a % b) + b obtenemos nuestro resultado deseado.

Esto significa que la lógica en checkPosition se convierte en:

position = position % mImageIds.length; 
if (position < 0) 
    position = position + mImageIds.length; 

que debe trabajar para todos los valores de position independientemente del valor de mImageIds.length.

+0

gracias por responder reece me coloqué este código imagen anterior agregar imágenes continuar funcionando bien pero sin agregar primera imagen 0 posición agregada -21 -20 -19 .... estoy adelante alguna captura de pantalla primera imagen fachada no agregada imágenes (espacio en blanco) http://www.freeimagehosting.net/image.php?d816500473.png – Narasimha

+0

Lo siento, no entiendo lo que quiere decir: ¿ha agregado la posición <0 caso a checkPosition? – reece

+0

sí reece en la galería primera imagen antes de no agregarse a las últimas imágenes y su visualización espacio vacío después de la primera imagen orden cíclica soy tomar 4 imágenes orden (atrás ... 3 0 1 2 3 0 1 2 3 0 1 .. ... frente) este frente cíclico parte delantera delantera funciona bien no está funcionando – Narasimha

12

Si alguien desea hacer que también vaya hacia atrás, puede implementar esto. Todo lo que realmente hace es comenzar la galería en el medio.

GalleryName.setSelection((int)(Integer.MAX_VALUE/2) - (Integer.MAX_VALUE/2) % mImageIds.length); 
+0

hola galeria gogothee en el thanku perfectamente funciona pero hay un problema rotacion de imagen una por una pero la galeria no esta rotando yo pegaré salva el codigo arriba por favor alguna solucion esta rotacion soy aplicacion al manejador – Narasimha

+0

gracias gogothee mucho funciona bien – Narasimha

+0

¿Es esa posición del primer elemento en la galería siempre? – Veljko

4

el código Adaptador para la explicación de Reece se puede encontrar aquí: android circular gallery?

Sólo asegúrese de utilizar la sugerencia de gogothee para mover la selección inicial al punto medio de la gama. (para que pueda desplazarse hacia la izquierda y la derecha casi por siempre).Por ejemplo, lo hice así:

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.mylayout); 

    //get references to UI components 
    mGallery = (Gallery) findViewById(R.id.filter_gallery); 

    //connect Galleries with adapters 
    mGallery.setAdapter(new GalleryAdapter(this)); 

    //auto-select first image (position 1073741820) 
    mGallery.setSelection((int)(Integer.MAX_VALUE/2) - ((Integer.MAX_VALUE/2) % mImageBuffer.getCount())); 
} 
0

Un tapón desvergonzada del uno mismo, acabo de escribir un Infinito Desplazamiento Galería Tutorial:

http://blog.blundell-apps.com/infinite-scrolling-gallery/

Puedo usar el mismo matemáticas modulas como @reece, código fuente también se puede descargar.

Puede utilizar imágenes en la tarjeta SD o imágenes en su directorio/recursos/dibujable

0

Haciendo primer elemento como el centro de la matriz disponibles:

your_gallery_obj.setSelection ((int) (Integer.MAX_VALUE/2) - (Integer.MAX_VALUE/2)% your_array_size);

Para hacer elemento medio como centro de matriz disponible:

your_gallery_obj.setSelection ((int) (Integer.MAX_VALUE/2) + (Integer.MAX_VALUE/2)% your_array_size);

Cuestiones relacionadas