Android 使用 ViewPager 实现左右循环滑动图片
<!-- 滑动图片布局文件 --> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <android.support.v4.view.ViewPager android:id="@+id/vpSlideImg" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <LinearLayout android:id="@+id/llSlideImg" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_marginBottom="30dp" android:gravity="center_horizontal" android:orientation="horizontal" > </LinearLayout> </RelativeLayout> </FrameLayout> /** * Copyright(C) 2014 Beijing Oradt Ltd. * For Digital Visiting Card 1.0 File * Name:SlideImageActivity.java * Description:左右滑动图片 * Author: Xiao JinLai * Date:2014-12-18上午11:46:56 * History: Date: Author: Depiction: */ public class SlideImageActivity extends Activity implements OnPageChangeListener { /** * ViewPager */ private ViewPager mViewPager; /** * 装点点的ImageView数组 */ private ImageView[] mTips; /** * 装ImageView数组 */ private ImageView[] mImageViews; /** * 图片资源id */ private int[] mImgIdArray; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initControl(); // 加载控件 } /** * 加载控件 */ private void initControl() { setContentView(R.layout.activity_slide_img); ViewGroup tViewGroup = (ViewGroup) findViewById(R.id.llSlideImg); mViewPager = (ViewPager) findViewById(R.id.vpSlideImg); // 载入图片资源ID mImgIdArray = new int[] { R.drawable.item01, R.drawable.item02, R.drawable.item03, R.drawable.item04, R.drawable.item05, R.drawable.item06, R.drawable.item07, R.drawable.item08 }; // 将点点加入到ViewGroup中 mTips = new ImageView[mImgIdArray.length]; for (int i = 0; i < mTips.length; i++) { ImageView imageView = new ImageView(this); imageView.setLayoutParams(new LayoutParams(10, 10)); mTips[i] = imageView; if (i == 0) { mTips[i].setBackgroundResource(R.drawable.page_indicator_focused); } else { mTips[i].setBackgroundResource(R.drawable.page_indicator_unfocused); } tViewGroup.addView(imageView); } // 将图片装载到数组中 mImageViews = new ImageView[mImgIdArray.length]; for (int i = 0; i < mImageViews.length; i++) { ImageView imageView = new ImageView(this); mImageViews[i] = imageView; imageView.setBackgroundResource(mImgIdArray[i]); } // 设置Adapter mViewPager.setAdapter(new SlideImgAdapter(mImageViews)); // 设置监听,主要是设置点点的背景 mViewPager.setOnPageChangeListener(this); // 设置ViewPager的默认项, 设置为长度的100倍,这样子开始就能往左滑动 // mViewPager.setCurrentItem((mImageViews.length) * 100); } @Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageSelected(int arg0) { setImageBackground(arg0); } /** * 设置选中的tip的背景 * * @param selectItems */ private void setImageBackground(int selectItems) { for (int i = 0; i < mTips.length; i++) { if (i == selectItems) { mTips[i].setBackgroundResource(R.drawable.page_indicator_focused); } else { mTips[i].setBackgroundResource(R.drawable.page_indicator_unfocused); } } } } /** * Copyright(C) 2014 Beijing Oradt Ltd. * For Digital Visiting Card 1.0 File * Name:SlideImgAdapter.java * Description:滑动图片适配器 * Author: Xiao JinLai * Date:2014-12-19上午10:57:51 * History: Date: Author: Depiction: */ public class SlideImgAdapter extends PagerAdapter { private ImageView[] mImageViews; public SlideImgAdapter(ImageView[] imageViews) { this.mImageViews = imageViews; } /** * 返回可用的视图的总数 */ @Override public int getCount() { return mImageViews.length; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } /** * PagerAdapter只缓存三张要显示的图片,如果滑动的图片超出了缓存的范围,就会调用这个方法,将图片销毁 View:是 * instantiateItem 中已添加的 view position:0 object:是 ViewGroup view * 子View的第 0 个元素。 */ @Override public void destroyItem(ViewGroup view, int position, Object object) { view.removeView(mImageViews[position]); } /** * 当要显示的图片可以进行缓存的时候,会调用这个方法进行显示图片的初始化, 我们将要显示的 ImageView 加入到 ViewGroup * 中,然后作为返回值返回即可 */ @Override public Object instantiateItem(ViewGroup view, int position) { view.addView(mImageViews[position]); return mImageViews[position]; } } 接着看看,程序运行后在 SlideImgAdapter 中运行的状态。 先走 getCount 然后 instantiateItem(ViewGroup view, int position) 在 view 中添加了两个View后,又回到 getCount 接着 isViewFromObject(View view, Object object) 我看到的 view 与 object 的 Id 一样,说明是一个对象。并同为 ImageView ,返回值是 true 还是走 isViewFromObject(View view, Object object) 这时我看到的 view 与 object 的 Id 不一样了,说明不是一个对象,但同为 ImageView ,返回值是 false 还是走 isViewFromObject(View view, Object object) 我看到的 view 与 object 的 Id 一样:830016405576,说明是一个对象。并同为 ImageView ,返回值是 true 还是走 isViewFromObject(View view, Object object) 我看到的 view 与 object 的 Id 一样:830018479360,说明是一个对象。并同为 ImageView ,返回值是 true 还是走 isViewFromObject(View view, Object object) 这时我看到的 view 与 object 的 Id 不一样了, view(Id):830016405576 object(Id):830018479360 说明不是一个对象,但同为 ImageView ,返回值是 false 还是走 isViewFromObject(View view, Object object) 我看到的 view 与 object 的 Id 一样:830016405576,说明是一个对象。并同为 ImageView ,返回值是 true 还是走 isViewFromObject(View view, Object object) 我看到的 view 与 object 的 Id 一样:830018479360,说明是一个对象。并同为 ImageView ,返回值是 true 还是走 isViewFromObject(View view, Object object) 这时我看到的 view 与 object 的 Id 不一样了, view(Id):830016405576 object(Id):830018479360 说明不是一个对象,但同为 ImageView ,返回值是 false 还是走 isViewFromObject(View view, Object object) 我看到的 view 与 object 的 Id 一样:830016405576,说明是一个对象。并同为 ImageView ,返回值是 true 左滑动图片,