Viewpager制作自动左右循环滑动
1、布局文件,framlaout包含两层:viewpager+小点点
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <FrameLayout android:layout_width="fill_parent" android:layout_height="120dp" > <android.support.v4.view.ViewPager android:id="@+id/Pager" android:layout_width="fill_parent" android:layout_height="120dp" android:layout_gravity="center" android:flipInterval="30" android:persistentDrawingCache="animation" /> <LinearLayout android:id="@+id/viewGroup" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:orientation="horizontal" > </LinearLayout> </FrameLayout> </RelativeLayout>
2、主代码
// Views动态数组,装载图片,views.add(imaV); private List<View> views; // 滑动控件 private ViewPager pager; // 装载小点指示器 private ViewGroup group; ................................. initViewPager(); setpagerListener(); ................................ private void initViewPager() { // TODO Auto-generated method stub pager = (ViewPager) view.findViewById(R.id.Pager); group = (ViewGroup) view.findViewById(R.id.viewGroup); LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); ImageView imaV; int[] ids = { R.drawable.pic1, R.drawable.pic2, R.drawable.pic3 }; views = new ArrayList<View>(); for (int i = 0; i < ids.length; i++) { imaV = new ImageView(getActivity()); imaV.setImageResource(ids[i]); imaV.setLayoutParams(params); imaV.setScaleType(ScaleType.FIT_XY); views.add(imaV); } for (int i = 0; i < ids.length; i++) { imaV = new ImageView(getActivity()); imaV.setLayoutParams(new LayoutParams(12, 12)); if (i == 0) { imaV.setBackgroundResource(R.drawable.page_indicator_focused); } else { imaV.setBackgroundResource(R.drawable.page_indicator_unfocused); } group.addView(imaV); } pager.setAdapter(new MyAdapter(views)); //当前页设置为很大才可以左滑 pager.setCurrentItem((views.size()) * 100); } /** * 设置选中的tip的背景 * * @param selectItems */ private void setImageBackground(int selectItems) { for (int i = 0; i < group.getChildCount(); i++) { if (i == selectItems) { group.getChildAt(i).setBackgroundResource( R.drawable.page_indicator_focused); } else { group.getChildAt(i).setBackgroundResource( R.drawable.page_indicator_unfocused); } } } ............................................. private void setpagerListener() { // TODO Auto-generated method stub pager.setOnPageChangeListener(new OnPageChangeListener() { /** * onPageSelected:每次切换页面就会执行 在此实现圆点指示器以及在最后页面显示button */ @Override public void onPageSelected(int arg0) { // TODO Auto-generated method stub setImageBackground(arg0 % views.size()); } /** * 当页面在滑动的时候会调用此方法,在滑动被停止之前,此方法回得到调用。 其中三个参数的含义分别为: * * arg0 :当前页面,及你点击滑动的页面 * * arg1:当前页面偏移的百分比 * * arg2:当前页面偏移的像素位置 */ @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } }); }
3、适配器
import java.util.List; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.util.Log; import android.view.View; public class MyAdapter extends PagerAdapter { private List<View> views; public MyAdapter(List<View> views) { this.views = views; } // destroyItem,getCount,instantiateItem实现循环滑动 @Override public void destroyItem(View arg0, int arg1, Object arg2) { // ((ViewPager) arg0).removeView(views.get(arg1 % views.size())); } /* * (non-Javadoc) * * @see android.support.v4.view.PagerAdapter#getCount() 这样才可以一直滑 */ @Override public int getCount() { return Integer.MAX_VALUE; } /* * (non-Javadoc) * * @see * android.support.v4.view.PagerAdapter#instantiateItem(android.view.View, * int) 如果出现错误不会fc,而是在catch里面处理,实现左滑 */ @Override public Object instantiateItem(View arg0, int arg1) { Log.e("tag", "instantiateItem = " + arg1); try { ((ViewPager) arg0).addView(views.get(arg1 % views.size()), 0); } catch (Exception e) { // handler something } return views.get(arg1 % views.size()); } @Override public boolean isViewFromObject(View arg0, Object arg1) { // TODO Auto-generated method stub return false; } }
4、实现自动切换图片.
ScheduledExecutorService scheduledExecutorService; ................................ @Override public void onStart() { // TODO Auto-generated method stub scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); // 当Activity显示出来后,每6秒切换一次图片 // scheduleAtFixedRate安排所提交的Runnable任务按指定的间隔重复执行 scheduledExecutorService.scheduleAtFixedRate(new ScrollTask(), 1, 6, TimeUnit.SECONDS); super.onStart(); } @Override public void onStop() { // 当Activity不可见的时候停止切换 scheduledExecutorService.shutdown(); super.onStop(); }
Done!