我集成了轮播,将所有逻辑集成到了一个类中,使用时只需在布局中添加即可,不需在界面做处理
/** * ViewPager实现的轮播图广告自定义视图,如京东首页的广告轮播图效果; * 既支持自动轮播页面也支持手势滑动切换页面 */ public class SlideShowView extends FrameLayout { //自动轮播的时间间隔 private final static int TIME_INTERVAL = 5; //自定义轮播图的资源 private String[] imageUrls; //放轮播图片的ImageView 的list 用于显示在ViewPager中 private List<ImageView> mView; //放圆点的View的list private List<View> dotViewsList; //显示标题 private TextView tvTitle; private LinearLayout dotLayout; private ViewPager viewPager; // 根布局 private RelativeLayout rlAutoPlayPic; //当前轮播页 private int currentItem = 0; //定时任务 private ScheduledExecutorService scheduledExecutorService; private Context mContexnt; //推荐课程集合 private List<MyFiles> mDatas = new ArrayList<>(); //Handler private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); viewPager.setCurrentItem(currentItem); } }; public SlideShowView(Context context) { this(context, null); } public SlideShowView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public SlideShowView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.mContexnt = context; mView = new ArrayList<ImageView>(); dotViewsList = new ArrayList<View>(); initCourseData(); } /** * 开始轮播图切换 */ private void startPlay() { scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); scheduledExecutorService.scheduleAtFixedRate( // 执行线程、初始化延时、两次开始执行最小间隔时间、计时单位 new SlideShowTask(), 1, TIME_INTERVAL, TimeUnit.SECONDS); } /** * 停止轮播图切换 */ private void stopPlay() { scheduledExecutorService.shutdown(); } /** *此方法获取数据,得到图片的url地址,此处使用volley框架获取数据,因数据直接给定,未解析jsonObject,个人按需求改动,此处只为获取url数据 */ private void initCourseData() { if (PublicMethod.isNetworkAvailable(mContexnt)) { String url = UrlUtil.courseTypeUrl;//推荐轮播接口 Request req = new MyPostRequest(url, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject jsonObject) { try { imageUrls=new String[5]; imageUrls[0]="http://img0.imgtn.bdimg.com/it/u=2706352503,1302632589&fm=21&gp=0.jpg"; imageUrls[1]="http://pic20.nipic.com/20120328/9700539_121656220178_2.jpg"; imageUrls[2]="http://img2.imgtn.bdimg.com/it/u=516966998,508515612&fm=21&gp=0.jpg"; imageUrls[3]="http://jiangsu.sinaimg.cn/2013/0219/U8954P1194DT20130219155624_1.jpg"; imageUrls[4]="http://p1.qhimg.com/t010775d8b57646a0b5.jpg"; } catch (Exception e) { e.printStackTrace(); } finally { // 初始化控件 initUI(mContexnt); startPlay();//开始轮播 } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { } }); CusQuesApplication.getInstance().addToRequestQueue(req, "course"); } else { PublicMethod.cusToast((Activity) mContexnt, getResources().getString(R.string.net_wrong), 0); } } /** * 初始化Views等UI */ private void initUI(final Context context) { LayoutInflater.from(context).inflate(R.layout.layout_slideshow, this, true); rlAutoPlayPic = (RelativeLayout) findViewById(R.id.rlAutoPlayPic); rlAutoPlayPic.setVisibility(VISIBLE); if (imageUrls == null || imageUrls.length == 0) { // 隐藏当前轮播图片布局 rlAutoPlayPic.setVisibility(GONE); return; } dotLayout = (LinearLayout) findViewById(R.id.dotLayout); // 移除现有所有View dotLayout.removeAllViews(); // 热点个数与图片个数 相等 for (int i = 0; i < imageUrls.length; i++) { // final MyFiles course = mDatas.get(i); final ImageView imageView = new ImageView(context); imageView.setTag(imageUrls[i]); //在imageview中加载图片 imageView.setScaleType(ImageView.ScaleType.FIT_XY); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); //此处我集成了图片访问的方法,根据个人情况,实际操作就好,此处为根据url地址展示图片到view ImageLoader.getInstance().displayImage( imageUrls[i], imageView, UrlUtil.mImageOptions); imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { /* Intent intent = new Intent(context, CourseDetailActivity.class); intent.putExtra("id", course.getId()); intent.putExtra("subscribe", course.getSubscribe()); context.startActivity(intent);*/ } }); mView.add(imageView); if (i == 0) { tvTitle = (TextView) findViewById(R.id.tvTitle); // tvTitle.setText(course.getFileName());书写标题,根据个人需求取舍 } ImageView dotView = new ImageView(context); LinearLayout.LayoutParams piv = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); piv.leftMargin = 4; piv.rightMargin = 4; dotLayout.addView(dotView, piv); dotViewsList.add(dotView); } viewPager = (ViewPager) findViewById(R.id.viewPager); viewPager.setFocusable(true); viewPager.setAdapter(new MyPagerAdapter()); viewPager.setOnPageChangeListener(new MyPageChangeListener()); } /** * 填充ViewPager的页面适配器 */ private class MyPagerAdapter extends PagerAdapter { @Override public void destroyItem(View container, int position, Object object) { ((ViewPager) container).removeView(mView.get(position)); } @Override public Object instantiateItem(View container, int position) { ImageView imageView = mView.get(position); ImageLoader.getInstance().displayImage(imageView.getTag() + "", imageView); ((ViewPager) container).addView(mView.get(position)); return mView.get(position); } @Override public int getCount() { return mView.size(); } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { } @Override public Parcelable saveState() { return null; } @Override public void startUpdate(View arg0) { } @Override public void finishUpdate(View arg0) { } } /** * ViewPager的监听器 * 当ViewPager中页面的状态发生改变时调用 */ private class MyPageChangeListener implements ViewPager.OnPageChangeListener { boolean isAutoPlay = false; @Override public void onPageScrollStateChanged(int arg0) { switch (arg0) { case 1:// 手势滑动,空闲中 isAutoPlay = false; break; case 2:// 界面切换中 isAutoPlay = true; break; case 0:// 滑动结束,即切换完毕或者加载完毕 // 当前为最后一张,此时从右向左滑,则切换到第一张 if (viewPager.getCurrentItem() == viewPager.getAdapter().getCount() - 1 && !isAutoPlay) { viewPager.setCurrentItem(0); } // 当前为第一张,此时从左向右滑,则切换到最后一张 else if (viewPager.getCurrentItem() == 0 && !isAutoPlay) { viewPager.setCurrentItem(viewPager.getAdapter().getCount() - 1); } break; } } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageSelected(int pos) { currentItem = pos; // 设置切换时显示的标题以及焦点图 // tvTitle.setText(mDatas.get(pos).getFileName()); for (int i = 0; i < dotViewsList.size(); i++) { if (i == pos) { (dotViewsList.get(pos)).setBackgroundResource(R.mipmap.dot_focus); } else { (dotViewsList.get(i)).setBackgroundResource(R.mipmap.dot_blur); } } } } /** * 执行轮播图切换任务 */ private class SlideShowTask implements Runnable { @Override public void run() { synchronized (viewPager) { currentItem = (currentItem + 1) % mView.size(); handler.obtainMessage().sendToTarget(); } } } }这是此view的定义,下面附上layout_slidershow.xml
的代码,即为此view中使用到的布局
<?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="fill_parent" android:id="@+id/rlAutoPlayPic" > <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="wrap_content" /> <!--底部焦点图--> <LinearLayout android:id="@+id/bottom_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="@color/reveal_color" android:orientation="horizontal" android:gravity="center" android:padding="5dp"> <TextView android:id="@+id/tvTitle" android:layout_weight="1" android:layout_width="0dp" android:layout_height="wrap_content" android:ellipsize="end" android:singleLine="true" android:text="方便用户后续的使用打开指定的网页" android:textColor="@color/white" /> <LinearLayout android:id="@+id/dotLayout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:gravity="right|center" android:orientation="horizontal"> <!-- 后台通过代码动态添加--> <View android:id="@+id/v_dot1" android:layout_width="8dp" android:layout_height="8dp" android:background="@mipmap/dot_focus" /> </LinearLayout> </LinearLayout> </RelativeLayout>,,最后,附上引用此自定义的方法
<RelativeLayout android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="5"> <com.scdl.zny.view.SlideShowView android:layout_width="match_parent" android:layout_height="fill_parent" ></com.scdl.zny.view.SlideShowView> </RelativeLayout>如此直接添加到所需要的界面即可,在界面中不需要设置代码逻辑,根据个人需要在view代码中改动url的来源即可。