2010-04-08 7 views
10

autorización I tienen una ViewFlipper con tres LinearLayouts anidado en su interior. Por defecto muestra el primero. Este código:Haciendo un ViewFlipper como la pantalla principal con MotionEvent.ACTION_MOVE

// Assumptions in my Activity class: 
// oldTouchValue is a float 
// vf is my view flipper 
@Override 
public boolean onTouchEvent(MotionEvent touchEvent) { 
    switch (touchEvent.getAction()) { 
    case MotionEvent.ACTION_DOWN: { 
     oldTouchValue = touchEvent.getX(); 
     break; 
    } 
    case MotionEvent.ACTION_UP: { 
     float currentX = touchEvent.getX(); 
     if (oldTouchValue < currentX) { 
     vf.setInAnimation(AnimationHelper.inFromLeftAnimation()); 
     vf.setOutAnimation(AnimationHelper.outToRightAnimation()); 
     vf.showNext(); 
     } 
     if (oldTouchValue > currentX) { 
     vf.setInAnimation(AnimationHelper.inFromRightAnimation()); 
     vf.setOutAnimation(AnimationHelper.outToLeftAnimation()); 
     vf.showPrevious(); 
     } 
     break; 
    } 
    case MotionEvent.ACTION_MOVE: { 
     // TODO: Some code to make the ViewFlipper 
     // act like the home screen. 
     break; 
    } 
    } 
    return false; 
} 

public static class AnimationHelper { 
    public static Animation inFromRightAnimation() { 
    Animation inFromRight = new TranslateAnimation(
    Animation.RELATIVE_TO_PARENT, +1.0f, 
    Animation.RELATIVE_TO_PARENT, 0.0f, 
    Animation.RELATIVE_TO_PARENT, 0.0f, 
    Animation.RELATIVE_TO_PARENT, 0.0f); 
    inFromRight.setDuration(350); 
    inFromRight.setInterpolator(new AccelerateInterpolator()); 
    return inFromRight; 
    } 

    public static Animation outToLeftAnimation() { 
    Animation outtoLeft = new TranslateAnimation(
    Animation.RELATIVE_TO_PARENT, 0.0f, 
    Animation.RELATIVE_TO_PARENT, -1.0f, 
    Animation.RELATIVE_TO_PARENT, 0.0f, 
    Animation.RELATIVE_TO_PARENT, 0.0f); 
    outtoLeft.setDuration(350); 
    outtoLeft.setInterpolator(new AccelerateInterpolator()); 
    return outtoLeft; 
    } 

    // for the next movement 
    public static Animation inFromLeftAnimation() { 
    Animation inFromLeft = new TranslateAnimation(
    Animation.RELATIVE_TO_PARENT, -1.0f, 
    Animation.RELATIVE_TO_PARENT, 0.0f, 
    Animation.RELATIVE_TO_PARENT, 0.0f, 
    Animation.RELATIVE_TO_PARENT, 0.0f); 
    inFromLeft.setDuration(350); 
    inFromLeft.setInterpolator(new AccelerateInterpolator()); 
    return inFromLeft; 
    } 

    public static Animation outToRightAnimation() { 
    Animation outtoRight = new TranslateAnimation(
    Animation.RELATIVE_TO_PARENT, 0.0f, 
    Animation.RELATIVE_TO_PARENT, +1.0f, 
    Animation.RELATIVE_TO_PARENT, 0.0f, 
    Animation.RELATIVE_TO_PARENT, 0.0f); 
    outtoRight.setDuration(350); 
    outtoRight.setInterpolator(new AccelerateInterpolator()); 
    return outtoRight; 
    } 
} 

... maneja la vista volteando pero las animaciones son muy "on/off". Me pregunto si alguien puede ayudarme con la última parte. Suponiendo que pueda acceder a los LinearLayouts, hay una manera donde puedo fijar la posición de los diseños basados ​​en deltaX y deltaY?

Alguien me dio this link y dijo que debería consultar el método applyTransformation para obtener sugerencias sobre cómo hacer esto, pero no sé cómo repetir este mismo comportamiento.

Respuesta

10

Mover la vista mientras se está moviendo el dedo se hace fácilmente:

case MotionEvent.ACTION_MOVE: 
    final View currentView = vf.getCurrentView(); 
    currentView.layout((int)(touchEvent.getX() - oldTouchValue), 
      currentView.getTop(), currentView.getRight(), 
      currentView.getBottom()); 
break; 

Ahora bien, esto sólo se mueve la vista actual, no a los vecinos. No probé eso todavía, pero probablemente los pueda obtener getChildAt:

vf.getChildAt(vf.getDisplayedChild() - 1); // previous 
vf.getChildAt(vf.getDisplayedChild() + 1); // next 

Espero que ayude.

+0

Ok, que funciona! Puedo entender el resto, gracias. – DJTripleThreat

1

Si entiendo su solicitud, este efecto debe ahora ser implementado utilizando un View Pager

se ve así:

enter image description here

+0

Este es otro enfoque http://www.androiduipatterns.com/2011/06/android-ui-pattern-workspaces.html – Kurru

+0

Ignorar que segundo enlace, Ver localizadores son la manera correcta de hacer esto – Kurru

Cuestiones relacionadas