总结了一下网上关于viewPager广告栏的文章自己写了一个demo,第一次写写的不好请多见谅。
首先贴上布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <RelativeLayout android:layout_width="wrap_content" android:layout_height="200dp"> <android.support.v4.view.ViewPager android:id="@+id/my_pager" android:layout_width="match_parent" android:layout_height="wrap_content" /> <LinearLayout android:id="@+id/viewpager_point" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="10dp" android:orientation="horizontal"> </LinearLayout> </RelativeLayout> </LinearLayout>里面LinearLayout主要是为了放置小圆点
接下来是Activity文件
public class ViewpagerActivity extends Activity { private ViewPager pager; private LinearLayout layout; private List<Integer> data = new ArrayList<>(); private FixedSpeedScroller mScroller; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_viewpager); pager = (ViewPager) findViewById(R.id.my_pager); layout = (LinearLayout) findViewById(R.id.viewpager_point); data.add(R.drawable.b); data.add(R.drawable.a); data.add(R.drawable.c); data.add(R.drawable.d); data.add(R.drawable.e); /*初始化设置切换速率的代码*/ try { Field mField = ViewPager.class.getDeclaredField("mScroller"); mField.setAccessible(true); mScroller = new FixedSpeedScroller(pager.getContext(), new AccelerateInterpolator()); mField.set(pager, mScroller); } catch (Exception e) { e.printStackTrace(); } MyPagerAdapter adapter = new MyPagerAdapter(this, pager,mScroller,layout); pager.setAdapter(adapter); pager.setPageTransformer(true, new ZoomOutPageTransformer());//设置切换时的动画 adapter.refresh(data);//模拟获取网络数据后刷新adapter } }
接下来是主要的Adapter代码
public class MyPagerAdapter extends PagerAdapter implements ViewPager.OnPageChangeListener { private List<Integer> data = new ArrayList<>(); private LinearLayout layout; private ViewPager viewPager; private Context context; private Basehandler<MyPagerAdapter> handler = null; private FixedSpeedScroller scroller; public MyPagerAdapter(Context context, ViewPager viewPager, FixedSpeedScroller scroller, LinearLayout layout) { this.context = context; this.viewPager = viewPager; this.scroller = scroller; this.layout = layout; viewPager.setOnPageChangeListener(this); handler = new Basehandler<MyPagerAdapter>(this) { @Override public void handleMessage(Message msg) { if (reference != null && reference.get() != null) { reference.get().handlerMessage();//这里Basehander里引用了弱引用 } } }; } private void handlerMessage() { try { int point = viewPager.getCurrentItem() + 1; viewPager.setCurrentItem(point); scroller.setmDuration(1 * 1000);//切换或滑动的速率,表示需要的秒数 } catch (Exception e) { } handler.sendEmptyMessageDelayed(1, 3000); } public void refresh(List<Integer> data) { handler.removeCallbacksAndMessages(null); this.data = data; notifyDataSetChanged(); addIndex();//添加小圆点 handler.sendEmptyMessageDelayed(1, 3000);//开始自动切换 } @Override public int getCount() { return (data == null || data.size() == 0) ? 0 : Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } @Override public Object instantiateItem(ViewGroup container, int position) { ImageView image = new ImageView(context); image.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); image.setScaleType(ImageView.ScaleType.CENTER_CROP); container.addView(image); image.setImageResource(data.get(position % (data.size()))); return image; } /** * 添加小圆点 */ private void addIndex() { layout.removeAllViews(); int count = viewPager.getCurrentItem(); int num = data.size(); for (int i = 0; i < num; i++) { ImageView imageView = new ImageView(context); imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); imageView.setPadding(0, 0, 10, 0); if (i == count) { imageView.setImageResource(R.drawable.view_ad_circle_normal); } else { imageView.setImageResource(R.drawable.view_ad_circle_selected); } layout.addView(imageView); } } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } /** * 切换时改变小圆点颜色 */ @Override public void onPageSelected(int position) { int count = position % data.size(); for (int i = 0; i < layout.getChildCount(); i++) { ImageView iv = (ImageView) layout.getChildAt(i); if (count == i) { iv.setImageResource(R.drawable.view_ad_circle_normal); } else { iv.setImageResource(R.drawable.view_ad_circle_selected); } } } @Override public void onPageScrollStateChanged(int state) { } }
Basehander的代码
public class Basehandler<T> extends Handler { public WeakReference<T> reference; public Basehandler(T t){ this.reference = new WeakReference<T>(t); } }接下来是重写了Viewpager.pageTransformer类关于Viewpager切换动画的代码(谷歌官方示例)
public class ZoomOutPageTransformer implements ViewPager.PageTransformer { private static final float MIN_SCALE = 0.85f; private static final float MIN_ALPHA = 0.5f; @Override public void transformPage(View page, float position) { int pageWidth = page.getWidth(); int pageHeight = page.getHeight(); if (position < -1) { page.setAlpha(0); } else if (position <= 1) { float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position)); float vertMargin = pageHeight * (1 - scaleFactor) / 2; float horzMargin = pageWidth * (1 - scaleFactor) / 2; if (position < 0) { page.setTranslationX(horzMargin - vertMargin / 2); } else { page.setTranslationX(-horzMargin + vertMargin / 2); } page.setScaleX(scaleFactor); page.setScaleY(scaleFactor); page.setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA)); } else { page.setAlpha(0); } } }
接下来是控制切换速率,有些人感觉viewpager切换是速率太快了,这时需要写一个继承scroller的类
public class FixedSpeedScroller extends Scroller { private int mDuration = 1000; 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; } }
所有的代码已经贴出,接下来展示下效果图