androdi viewPage 实现酷炫动画轮播

https://www.jb51.net/article/101806.htm

https://github.com/yangqi1993/Android-Coverflow


自定义动画

public class AlphaScaleTransformer implements ViewPager.PageTransformer {
    private static final float DEFAULT_MIN_ALPHA = 0.5f;
    private float mMinAlpha = DEFAULT_MIN_ALPHA;
    private static final float DEFAULT_MIN_SCALE = 0.85f;
    private float mMinScale = DEFAULT_MIN_SCALE;
    public static final float DEFAULT_CENTER = 0.5f;

    @Override
    public void transformPage(View view, float position) {
        int pageWidth = view.getWidth();
        int pageHeight = view.getHeight();
        view.setScaleX(0.999f);
        view.setPivotY(pageHeight/2);
        view.setPivotX(pageWidth /2);
        if (position < -1) {
            view.setAlpha(mMinAlpha);
            view.setScaleX(mMinScale);
            view.setScaleY(mMinScale);
            view.setPivotX(pageWidth);
        } else if (position <= 1) {
            if (position < 0) {
                float factor = mMinAlpha + (1 - mMinAlpha) * (1 + position);
                float scaleFactor = (1 + position) * (1 - mMinScale) + mMinScale;
                view.setAlpha(factor);
                view.setScaleX(scaleFactor);
                view.setScaleY(scaleFactor);
                view.setPivotX(pageWidth * (DEFAULT_CENTER + (DEFAULT_CENTER * -position)));
            } else {
                float factor = mMinAlpha + (1 - mMinAlpha) * (1 - position);
                float scaleFactor = (1 - position) * (1 - mMinScale) + mMinScale;
                view.setAlpha(factor);
                view.setScaleX(scaleFactor);
                view.setScaleY(scaleFactor);
                view.setPivotX(pageWidth * ((1 - position) * DEFAULT_CENTER));
            }
        } else {
            view.setAlpha(mMinAlpha);
            view.setPivotX(0);
            view.setScaleX(mMinScale);
            view.setScaleY(mMinScale);
        }
    }
}
 ViewPager mViewPager = holder.getView(R.id.pager_home);
 mViewPager.setPageMargin(2);//设置page间间距,自行根据需求设置
 mViewPager.setOffscreenPageLimit(3);//>=3
 mViewPager.setAdapter(new PagerAdapter() {
     @Override
     public int getCount() {
         return Integer.MAX_VALUE;
     }

     @Override
     public Object instantiateItem(ViewGroup container, int position) {
         ImageView imageView=new ImageView(context);
         imageView.setImageResource(imag.get(position%3));
         container.addView(imageView);
         return imageView;
     }

     @Override
     public void destroyItem(ViewGroup container, int position, Object object) {
         container.removeView((View)object);
     }

     @Override
     public boolean isViewFromObject(View view, Object object) {
         return view==object;
     }
 });

//setPageTransformer 决定动画效果
 mViewPager.setPageTransformer(true, new
        AlphaScaleTransformer());
 mViewPager.setCurrentItem(201);


 
 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/head_relative"
    android:layout_width="match_parent"
    android:gravity="center"
    android:clipChildren="false"
    android:orientation="vertical"
    android:layout_height="830px">
    <android.support.v4.view.ViewPager
        android:id="@+id/pager_home"
        android:layout_margin="30px"
        android:layout_width="800px"
        android:layout_height="560px"></android.support.v4.view.ViewPager>
</LinearLayout>
android:clipChildren="false" 的作用是 子view可以超出父容器


改变 viewpage 的滑动速度

import android.content.Context;
import android.view.animation.Interpolator;
import android.widget.Scroller;


public class FixedSpeedScroller extends Scroller {
    private int mDuration = 200;

    public FixedSpeedScroller(Context context) {
        super(context);
    }

    public FixedSpeedScroller(Context context, Interpolator interpolator) {
        super(context, interpolator);
    }

    @Override
    public void startScroll(int startX, int startY, int dx, int dy, int duration) {
        // Ignore received duration, use fixed one instead
        super.startScroll(startX, startY, dx, dy, mDuration);
    }

    @Override
    public void startScroll(int startX, int startY, int dx, int dy) {
        // Ignore received duration, use fixed one instead
        super.startScroll(startX, startY, dx, dy, mDuration);
    }

    public void setmDuration(int time) {
        mDuration = time;
    }

    public int getmDuration() {
        return mDuration;
    }
}

让后在viewpage 初始化之后 通过反射 修改viewpage的 scroll类

private void initViewPagerScroll(){

    try {
        Field field = ViewPager.class.getDeclaredField("mScroller");
        field.setAccessible(true);
        FixedSpeedScroller scroller = new FixedSpeedScroller(mViewPager.getContext(),
                new AccelerateInterpolator());
        field.set(mViewPager, scroller);
        scroller.setmDuration(2000);
    } catch (Exception e) {

    }
}


猜你喜欢

转载自blog.csdn.net/qq_40446718/article/details/80800923