ViewPager实现图片的自动轮播和无限循环

来源:互联网 发布:windows tasks sched 编辑:程序博客网 时间:2024/04/30 08:36

在开发的时候想做个图片的轮播,在网上找了一些资料,发现不符合我个人的习惯,然后就自己写了个,还是直接贴上代码吧...

DishDetailActivity.java

import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.apache.http.Header;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.view.ViewGroup.LayoutParams;import android.widget.ImageView;import android.widget.ImageView.ScaleType;import android.widget.Toast;import com.qt_media.diancan.R;import com.qt_media.diancan.adapter.DishDetailImageAdapter;public class DishDetailActivity extends Activity implementsOnPageChangeListener {private DishDetailImageAdapter mAdapter;//ViewPagerprivate ViewPager viewPager;//装点点的ImageView数组private ImageView[] tips;// 装ImageView数组private ImageView[] mImageViews;//装图片id的数组private int[] picId = new int[]{ R.drawable.pic01, R.drawable.pic02, R.drawable.pic03, R.drawable.pic04};private String[] picArray;private ViewGroup group;private static Handler handler;private int EndPageId = 2;private final long delay = 2500;private final int AUTO = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO 自动生成的方法存根super.onCreate(savedInstanceState);setContentView(R.layout.activity_dishdetail);init();}private void init() {// TODO 自动生成的方法存根group = (ViewGroup) findViewById(R.id.viewGroup);viewPager = (ViewPager) findViewById(R.id.viewPager);gatDishDetail();// 将图片装载到数组中mImageViews = new ImageView[3];for (int i = 0; i < mImageViews.length; i++) {ImageView imageView = new ImageView(this);imageView.setBackgroundResource(R.drawable.pic_error);mImageViews[i] = imageView;}// 将点点加入到ViewGroup中tips = new ImageView[mImageViews.length];for (int i = 0; i < tips.length; i++) {ImageView imageView = new ImageView(this);imageView.setLayoutParams(new LayoutParams(30, 30));tips[i] = imageView;if (i == 0) {tips[i].setBackgroundResource(R.drawable.dots_on);} else {tips[i].setBackgroundResource(R.drawable.dots);}group.addView(imageView);}// 设置AdaptermAdapter = new DishDetailImageAdapter(mImageViews);viewPager.setAdapter(mAdapter);// 设置监听,主要是设置点点的背景viewPager.setOnPageChangeListener(this);// 设置ViewPager的默认项, 设置为长度的100倍,这样子开始就能往左滑动viewPager.setCurrentItem((mImageViews.length) * 100);mHandler.sendEmptyMessageDelayed(AUTO, delay);}//使用handler来进行图片的自动轮播private Handler mHandler = new Handler() {@Overridepublic void dispatchMessage(Message msg) {switch (msg.what) {case AUTO:int index = viewPager.getCurrentItem();viewPager.setCurrentItem(index + 1);mHandler.sendEmptyMessageDelayed(AUTO, delay);break;default:break;}};};private void imgLoardAdapter() {ImageLoader mImageLoader = new ImageLoader(this);for (int i = 0; i < mImageViews.length; i++) { mImageViews[i].setImageResource(picId[i]);//这里可以换成加载网络图片mImageViews[i].setScaleType(ScaleType.CENTER_CROP);}// mAdapter.notifyDataSetChanged();}@Overridepublic void onPageScrollStateChanged(int arg0) {}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageSelected(int arg0) {setImageBackground(arg0 % mImageViews.length);}/** * 设置选中的tip的背景 *  * @param selectItems */private void setImageBackground(int selectItems) {for (int i = 0; i < tips.length; i++) {if (i == selectItems) {tips[i].setBackgroundResource(R.drawable.dots_on);} else {tips[i].setBackgroundResource(R.drawable.dots);}}}}

DishDetailImageAdapter.java

package com.qt_media.diancan.adapter;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.view.View;import android.widget.ImageView;public class DishDetailImageAdapter extends PagerAdapter {private ImageView[] mImageViews;public DishDetailImageAdapter(ImageView[] mImageViews) {// TODO 自动生成的构造函数存根this.mImageViews = mImageViews;}@Overridepublic int getCount() {return Integer.MAX_VALUE;}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0 == arg1;}@Overridepublic void destroyItem(View container, int position, Object object) {// 当只有三张或者两张图片时,这里执行removeView的话下面的代码会出现bug,所以我注释掉 //但是当要轮播的图片不止两张或者三张时,最好还是加上这段代码                                        // ((ViewPager) container).removeView(mImageViews[position// % mImageViews.length]);}/** * 载入图片进去,用当前的position 除以 图片数组长度取余数是关键 */@Overridepublic Object instantiateItem(View container, int position) {// 保险起见,防止图片只有两三张的时候出现问题,所以使用了try{}catch(){}try {((ViewPager) container).addView(mImageViews[position% mImageViews.length], 0);} catch (Exception e) {// handler something}return mImageViews[position % mImageViews.length];}}

activity_dishdetail.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="#353535"    android:orientation="vertical" >    <LinearLayout        android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:orientation="vertical" >        <FrameLayout            android:layout_width="fill_parent"            android:layout_height="wrap_content" >            <android.support.v4.view.ViewPager                android:id="@+id/viewPager"                android:layout_width="fill_parent"                android:layout_height="200dp" />            <RelativeLayout                android:layout_width="fill_parent"                android:layout_height="wrap_content"                android:layout_gravity="bottom"                android:layout_marginBottom="10dp"                android:orientation="vertical" >                <LinearLayout                    android:id="@+id/viewGroup"                    android:layout_width="fill_parent"                    android:layout_height="wrap_content"                    android:gravity="center_horizontal"                    android:orientation="horizontal" >                </LinearLayout>            </RelativeLayout>        </FrameLayout>    </LinearLayout></RelativeLayout>




0 0