2010-09-17 16 views
9

¿Es posible cambiar la disposición predeterminada de la Galería de Android? Lo que quiero decir es ¿podemos hacer la Galería en una trayectoria curva, donde las imágenes estarán a lo largo del camino curvado y al mismo tiempo tendrá todas las propiedades de la galería de Android?Posibilidad de una galería curva

Si es posible, por favor díganme sus ideas. Todas las ideas son bienvenidas.

, gracias & Saludos, Sen

+0

hiii puede compartir su código así que también puede poner en práctica en mi galería curva – Mahesh

Respuesta

12

Extender Galería y anular drawChild.

Se llamará a drawChild para cada niño que necesite ser dibujado.

protected boolean drawChild(Canvas canvas, View child, long drawingTime) { 

    final int left = child.getLeft(); 

    int adjustedXOrigin = left - (getWidth()/2) + (child.getWidth()/2); 

    int newtop = (int) (ellipseYOffset - Math.sqrt(ellipseMinor2 * (1 - ((Math.pow(adjustedXOrigin, 2))/ellipseMajor2)))); 
    newtop -= (child.getHeight()/2); 

    if(newtop >= 0) 
    { 
     child.layout(left, newtop, left + child.getWidth(), newtop + child.getHeight()); 
     return super.drawChild(canvas, child, drawingTime); 
    } 

    return true; 
} 

En onLayout calculo ellipseYOffset. Esto centra la vista del medio seleccionado verticalmente en la vista, sin importar el tamaño de la elipse.

ellipseYOffset = getMeasuredHeight() + (ellipseMinor - (getMeasuredHeight()/2)); 

El "si (Newtop> = 0)" parte se debe a la vista de forma aleatoria fueron verse envuelto en lugares extraños. Esto detuvo eso.

Editar: código completo

Hay algunas cosas de animación que no es necesario, simplemente copiar y pegar mi clase.

public class Carousel extends Gallery { 

private static final float INITIAL_MINOR_RATIO = 0.75f; 
private static final float INITIAL_MAJOR_RATIO = 1.0f; 

private int mEllipseMajor; 
private int mEllipseMinor; 
private int mEllipseMajor2; 
private int mEllipseMinor2; 
private int mEllipseYOffset; 

private Animation mGalleryAlphaOut; 
private Animation mGalleryAlphaIn; 

private OnAnimationEndListener mFadeInEndListener; 
private OnAnimationEndListener mFadeOutEndListener; 

private boolean mCustomEllipseDim = false; 

private boolean mInfinite = true; 

private int mXOff = 0; 

private AnimationListener mFadeInAnimationListener = new AnimationListener() { 
    public void onAnimationStart(Animation animation) {} 
    public void onAnimationRepeat(Animation animation) {} 
    public void onAnimationEnd(Animation animation) { 
     if(mFadeInEndListener != null) 
     { 
      mFadeInEndListener.onAnimationEnd(); 
     } 
    } 
}; 

private AnimationListener mFadeOutAnimationListener = new AnimationListener() { 
    public void onAnimationStart(Animation animation) {} 
    public void onAnimationRepeat(Animation animation) {} 
    public void onAnimationEnd(Animation animation) { 
     if(mFadeOutEndListener != null) 
     { 
      mFadeOutEndListener.onAnimationEnd(); 
     } 
    } 
}; 

public Carousel(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    init(); 
} 

public Carousel(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(); 
} 

public Carousel(Context context) { 
    super(context); 
    init(); 
} 

private void init() 
{ 
    setHorizontalFadingEdgeEnabled(false); 
    setCallbackDuringFling(true); 
    setUnselectedAlpha(1.0f); 
    setHapticFeedbackEnabled(false); 

    int dur = getResources().getInteger(R.integer.transition_dur); 

    mGalleryAlphaOut = AnimationUtils.loadAnimation(getContext(), android.R.anim.fade_out); 
    mGalleryAlphaOut.setFillAfter(true); 
    mGalleryAlphaOut.setDuration(dur); 
    mGalleryAlphaOut.setAnimationListener(mFadeOutAnimationListener); 
    mGalleryAlphaIn = AnimationUtils.loadAnimation(getContext(), android.R.anim.fade_in); 
    mGalleryAlphaIn.setFillAfter(true); 
    mGalleryAlphaIn.setDuration(dur); 
    mGalleryAlphaIn.setAnimationListener(mFadeInAnimationListener); 
} 

public int getEllipseMajor() { 
    return mEllipseMajor; 
} 

public void setEllipseMajor(int ellipseMajor) { 
    if(ellipseMajor == 0) 
    { 
     mCustomEllipseDim = false; 
    } 
    this.mEllipseMajor = ellipseMajor; 
} 

public int getEllipseMinor() { 
    return mEllipseMinor; 
} 

public void setEllipseMinor(int ellipseMinor) { 
    if(ellipseMinor == 0) 
    { 
     mCustomEllipseDim = false; 
    } 
    this.mEllipseMinor = ellipseMinor; 
} 

@Override 
protected boolean drawChild(Canvas canvas, View child, long drawingTime) { 
    final int left = child.getLeft(); 
    final int childWidth = child.getWidth(); 
    final int childHeight = child.getHeight(); 

    int adjustedXOrigin = left - mXOff + (childWidth>>1); 

    int newtop = (int) (mEllipseYOffset - Math.sqrt(mEllipseMinor2 * (1 - ((Math.pow(adjustedXOrigin, 2))/mEllipseMajor2)))); 
    newtop -= (childHeight>>1); 

    if(newtop >= 0) 
    { 
     child.layout(left, newtop, left + childWidth, newtop + childHeight); 
     return super.drawChild(canvas, child, drawingTime); 
    } 
    return true; 
} 
@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    super.onLayout(changed, l, t, r, b); 
    if(!mCustomEllipseDim) 
    { 
     mEllipseMajor = (int) (getMeasuredWidth() * INITIAL_MAJOR_RATIO + 0.5f); 
     mEllipseMinor = (int) (getMeasuredHeight() * INITIAL_MINOR_RATIO + 0.5f); 
     mEllipseMajor2 = (int) Math.pow(mEllipseMajor, 2); 
     mEllipseMinor2 = (int) Math.pow(mEllipseMinor, 2); 
    } 
    mEllipseYOffset = getMeasuredHeight() + (mEllipseMinor - (getMeasuredHeight()/2)); 

    mXOff = (getWidth()/2); 
} 

@Override 
public void setAdapter(SpinnerAdapter adapter) { 
    super.setAdapter(adapter); 
    if(mInfinite) 
    { 
     resetPosition(); 
    } 
} 

public void resetPosition() 
{ 
    int pos = Integer.MAX_VALUE/2; 
    if(getAdapter() != null && getAdapter().getClass() == CarouselAdapter.class) 
    { 
     int size = ((CarouselAdapter)getAdapter()).getList().size(); 
     if(size > 2) 
      pos = pos - (pos % ((CarouselAdapter)getAdapter()).getList().size()); 
     else 
      pos = 0; 
     setSelection(pos); 
    } 
} 

public OnAnimationEndListener getFadeInEndListener() { 
    return mFadeInEndListener; 
} 

public void setFadeInEndListener(OnAnimationEndListener fadeInEndListener) { 
    this.mFadeInEndListener = fadeInEndListener; 
} 

public OnAnimationEndListener getFadeOutEndListener() { 
    return mFadeOutEndListener; 
} 

public void setFadeOutEndListener(OnAnimationEndListener fadeOutEndListener) { 
    this.mFadeOutEndListener = fadeOutEndListener; 
} 

public void fadeIn() 
{ 
    startAnimation(mGalleryAlphaIn); 
} 

public void fadeOut() 
{ 
    startAnimation(mGalleryAlphaOut); 
} 

public interface OnAnimationEndListener 
{ 
    public abstract void onAnimationEnd(); 
} 

//This disables the effect of a vehicle becoming focused when it is clicked. 
@Override 
public boolean onSingleTapUp(MotionEvent e) { 
    if(getAdapter() != null) 
    { 
     if(pointToPosition((int)e.getX(), (int)e.getY()) != getSelectedItemPosition()) 
      return true; 
     else 
      return super.onSingleTapUp(e); 
    } 
    else 
     return true; 
} 
} 
+0

gracias generallee5686 .. va a probarlo y respuesta .. – Sen

+0

traté de extender la Galería nt pero podría encontrar drawChild método en el Gallery.java .. :-( – Sen

+0

¿Qué es __ELLIPSE_OFFSET_C__ and __mYOffset__? – Sen

6

creo que no hay ninguna disposición proporciona por Android para cambiar la alineación horizontal de la galería. Aunque podemos hacerlo vertical. Si quieres una vista de tipo curvo Galería, creo que es posible hacerlo desde cero

Gracias Abi