是否可以更改
Android gallery的默认安排?
我的意思是,我们可以将画廊置于弯曲的路径中,图像将沿着弯曲的路径,同时它具有Android图库的所有属性?
我的意思是,我们可以将画廊置于弯曲的路径中,图像将沿着弯曲的路径,同时它具有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); 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,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; 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; } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。