是否可以更改Android图库的默认排列? 我的意思是我们可以将画廊放在弯曲的路径上,图像将沿着弯曲的路径,同时它具有Android画廊的所有属性吗?
如果可能的话,请告诉我你的想法。欢迎所有的想法。
谢谢&问候, 森
答案 0 :(得分:12)
扩展图库并覆盖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, 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;
}
}
答案 1 :(得分:6)
我认为android没有提供更改图库水平对齐的规定。虽然我们可以让它垂直。如果您想要一个Curved Gallery类型视图,我认为可以从头开始
由于 阿比