2010-09-26 16 views

Respuesta

6

Gallery.setSelection (int position, boolean animate);

Consulte debajo de la URL: http://groups.google.com/group/android-developers/browse_thread/thread/9140fd6af3061cdf/7f89e53ae53e455b?lnk=gst&q=setselection#7f89e53ae53e455b

Soln: Si todavía está buscando, tengo dos soluciones posibles para que, tanto ligeramente desagradables:

(1) Puede hacer que el galería de qué una aventura con una velocidad elegida, por lo tanto:

myGallery.onFling (null, null, velocity, 0);

Ajustando la velocidad, puede configurar valores para mover la selección por uno o dos en cualquier dirección. Como la galería se autocentra, no es necesario que el destino sea exactamente el .

(2) Como la fuente de la Galería está disponible, puede modificarla para que implemente su propia Galería. No parece que necesites agregar mucho código para poder controlar una aventura para finalizar en la selección elegida .

Pensé que iba a tener que hacer (2), pero encontré que podía alejarme con (1) para mi problema.

+0

Método (1) funciona muy bien, sólo asegúrese de usar una velocidad suficientemente grande. Es una pena que los documentos de Android aquí sean tan engañosos: "Notificados de un evento arrojadizo cuando ocurra" es incorrecto en mi humilde opinión, debería decir algo como: "Le dice a la galería que realice una aventura" o el método debe llamarse performFling – pheelicks

2

Estaba buscando en la fuente de la Galería para ver si podía obtener esta característica. Parece que algo es posible con este código. Sin embargo, me rendí antes de que pudiera hacerlo funcionar. Parece que no estaba pasando las coordenadas correctas, por lo que res siempre devuelve false. Volvería verdadero si funcionó.

¡Simplemente publicando esto aquí, en caso de que alguien más quiera intentarlo! (¡Publique su solución si lo administra!)

Rect rect = new Rect(); 
gallery.getHitRect(rect); 


int x = rect.centerX()+getWindowManager().getDefaultDisplay().getWidth(); 
int y = rect.centerY(); 

MotionEvent event = MotionEvent.obtain(100, 100, MotionEvent.ACTION_DOWN, x, y, 0); 
timesGallery.onDown(event); 
boolean res = timesGallery.onSingleTapUp(null); 
2

Hice pocos cambios en el código dado por "Kurru". esto está funcionando ahora

Rect rect = new Rect(); 
    gallery.getHitRect(rect); 

    int width = Math.abs(rect.width()); 
    if(!isForwardScroll){ 
     width = width * -1; 
    } 
    int x = rect.centerX()+width/2; 
    int y = rect.centerY(); 

    MotionEvent event = MotionEvent.obtain(100, 100, MotionEvent.ACTION_DOWN, x, y, 0); 
    gallery.onDown(event); 
    boolean res = gallery.onSingleTapUp(null); 
+0

¿Puedes dar más código? o ejemplo?gracias – pengwang

6

Basado en la excelente idea de Kurru de simular haciendo clic en la vista siguiente o anterior.

//scroll forward or backward 
private void scroll(int type){ 
    View selectedV = mG.getSelectedView(); 
    int idx = mG.indexOfChild(selectedV); 
    switch(type){ 
     case FORWARD: 
    default: 
     if(idx<mG.getChildCount()-1) 
      idx++; 
     break; 
    case BACKWARD: 
     if(idx>0) 
      idx--;   
     break; 
    } 
    //now scrolled view's child idx in gallery is gotten 
    View nextView = mG.getChildAt(idx); 
    //(x,y) in scrolled view is gotten 
    int x = nextView.getLeft()+nextView.getWidth()/2; 
    int y = nextView.getTop()+nextView.getHeight()/2; 
    String out = String.format("x=%d, y=%d", x, y); 
    Log.i(TAG+".scroll", out); 

    //Kurru's simulating clicking view 
    MotionEvent event = MotionEvent.obtain(100, 100, MotionEvent.ACTION_DOWN, x, y, 0); 
    mG.onDown(event); 
    boolean res = mG.onSingleTapUp(null); 
    Log.i(TAG+".scroll", "onSingleTapUp return =" + res);  
} 
12

Ahora tengo este problema. Estaba tenga que mover un solo elemento de la galería, por lo que la mejor solución para mí era emular caso pulsada la tecla

myGallery.onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null); 

o

myGallery.onKeyDown(KeyEvent.KEYCODE_DPAD_LEFT, null); 
Cuestiones relacionadas