2010-09-17 21 views
9

È possibile modificare la disposizione predefinita della Galleria Android? Quello che volevo dire è che possiamo creare la Galleria in un percorso curvo, dove le immagini saranno lungo il percorso curvo e nello stesso tempo che ha tutte le proprietà della galleria Android?Possibilità di una galleria curva

Se possibile, per favore dimmi le tue idee. Tutte le idee sono ben accette

Grazie & saluti, Sen

+0

hiii è possibile condividere il codice in modo che io possa anche implementare nella mia galleria curva – Mahesh

risposta

12

Estendere Galleria e ignorare drawChild.

drawChild verrà chiamato per ogni figlio che deve essere disegnato.

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; 
} 

In onLayout calcolo ellipseYOffset. Ciò centra la vista centrale selezionata verticalmente nella vista, indipendentemente dalla dimensione dell'ellisse.

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

Il "se (NuovoTop> = 0)" parte è perché la vista sono stati casualmente sempre disegnato in posti strani. Questo l'ha fermato.

Edit: codice completo

V'è un certo roba di animazione che non è necessario, ho solo copiato e incollato la mia classe.

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

grazie generallee5686 .. sarà provare e risposta .. – Sen

+0

ho cercato di estendere la galleria ma potrebbe nt trovare drawChild metodo Gallery.java .. :-( – Sen

+0

Cosa sono __ELLIPSE_OFFSET_C__ e __mYOffset__? – Sen

6

penso che ci sia alcuna disposizione fornire da Android per modificare l'allineamento orizzontale della galleria. Sebbene possiamo renderlo verticale. Se si desidera una curva tipo di vista Galleria, penso che sia possibile fare da zero

Grazie Abi

Problemi correlati