Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 曲廊的可能性大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
是否可以更改 Android Gallery的认安排?
我的意思是,我们可以将画廊置于弯曲的路径中,图像将沿着弯曲的路径,同时它具有Android图库的所有属性

如果可能,请告诉我你的想法.欢迎所有的想法.

谢谢&问候,

解决方法

扩展图库并覆盖drawChild.

将为需要绘制的每个小孩调用drawChild.

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

在onLayout我计算ellipseYOffset.这使得中间选择的视图在视图中垂直居中,而不管椭圆大小.

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

“if(newtop> = 0)”部分是因为该视图随机地被绘制在奇怪的地方.这样就停了.

编辑:完整的代码

有一些你不需要的动画,我只是复制和粘贴我的课.

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);
    setUn@R_772_10288@ctedAlpha(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,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,left + childWidth,newtop + childHeight);
        return super.drawChild(canvas,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;
        set@R_772_10288@ction(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()) != get@R_772_10288@ctedItemPosition() )
            return true;
        else
            return super.onSingleTapUp(E);
    }
    else
        return true;
}
}

大佬总结

以上是大佬教程为你收集整理的android – 曲廊的可能性全部内容,希望文章能够帮你解决android – 曲廊的可能性所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。