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) { } }