效果图:

大家在写项目的过程中常常会碰到须要实现Viewpager里面载入几张图片来循环自己主动轮播的效果,假设不封装一下的话代码分散在activity里面会显得非常乱。并且也不利于我们下次复用,所以这里我把viewpager的相关代码抽取出来放在了一个类里面,使用的时候仅仅须要new 这个对象就可以。

直接看代码:

MyViewPager.java类:在activity中仅仅须要在初始化数据的时候增加MyViewPager myViewPager=new MyViewPager(this)这段代码就ok。
package com.duora.bobge.duoradeliverly_version2.custom_view;import android.app.Activity;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;import com.duora.bobge.duoradeliverly_version2.R;
import com.duora.bobge.duoradeliverly_version2.adapter.EventPageAdapter;
import com.duora.bobge.duoradeliverly_version2.base.BaseConfig;
import com.duora.bobge.duoradeliverly_version2.listener.NavigationPageChangeListener;import java.util.ArrayList;/*** Created by bobge on 15/8/10.*/
public class MyViewPager {private Activity activity;private ViewPager viewPager;private LinearLayout mViewPoints;private ArrayList<View> pageViews;private ImageView imageView;/** 将小圆点的图片用数组表示 */private ImageView[] imageViews;private Handler mHandler = new Handler() {@Overridepublic void dispatchMessage(Message msg) {switch (msg.what) {case BaseConfig.MSG_CHANGE_PHOTO:int index = viewPager.getCurrentItem();viewPager.setCurrentItem(index + 1);mHandler.sendEmptyMessageDelayed(BaseConfig.MSG_CHANGE_PHOTO,BaseConfig.PHOTO_CHANGE_TIME);break;}super.dispatchMessage(msg);}};public MyViewPager(Activity activity) {this.activity = activity;findViewById(activity);addData();initPoint();}private void addData() {pageViews = new ArrayList<View>();for (int i = 0; i < 5; i++) {ImageView imageView = new ImageView(activity);imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);//picasso载入图片switch (i){case 0:imageView.setBackgroundResource(R.mipmap.a);break;case 1:imageView.setBackgroundResource(R.mipmap.b);break;case 2:imageView.setBackgroundResource(R.mipmap.c);break;case 3:imageView.setBackgroundResource(R.mipmap.e);break;case 4:imageView.setBackgroundResource(R.mipmap.f);break;}pageViews.add(imageView);}}private void findViewById(Activity activity) {this.viewPager= (ViewPager)activity.findViewById(R.id.viewPager_main);this.mViewPoints= (LinearLayout)activity.findViewById(R.id.viewGroup);}//创建viewpager的那几个滑动的点private void initPoint() {// 创建imageviews数组,大小是要显示的图片的数量imageViews = new ImageView[pageViews.size()];// 加入小圆点的图片for (int i = 0; i < pageViews.size(); i++) {imageView = new ImageView(activity);// 设置小圆点imageview的參数LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(20, 20);layoutParams.setMargins(5, 0, 5, 0);imageView.setLayoutParams(layoutParams);// 创建一个宽高均为20 的布局// 将小圆点layout加入到数组中imageViews[i] = imageView;// 默认选中的是第一张图片,此时第一个小圆点是选中状态,其它不是if (i == 0) {imageViews[i].setBackgroundResource(R.mipmap.face_float_icon_on);} else {imageViews[i].setBackgroundResource(R.mipmap.face_float_icon);}// 将imageviews加入到小圆点视图组mViewPoints.addView(imageViews[i]);}// 设置viewpager的适配器和监听事件Log.i("test", pageViews.size() + "====");viewPager.setAdapter(new EventPageAdapter(pageViews));viewPager.setOnPageChangeListener(new NavigationPageChangeListener(pageViews, imageViews));viewPager.setCurrentItem((pageViews.size()) * 50);if(pageViews.size()>1){mHandler.sendEmptyMessageDelayed(BaseConfig.MSG_CHANGE_PHOTO, BaseConfig.PHOTO_CHANGE_TIME);}}
}

它的滑动监听和适配器:

NavigationPageChangeListener.java看命名应该就能知道这个类的作用了,不多说。
package com.duora.bobge.duoradeliverly_version2.listener;import android.support.v4.view.ViewPager;
import android.view.View;
import android.widget.ImageView;import com.duora.bobge.duoradeliverly_version2.R;import java.util.ArrayList;/*** Created by bobge on 15/8/5.*/
//viewpager滑动监听
public class NavigationPageChangeListener implements ViewPager.OnPageChangeListener {private ArrayList<View> pageViews;/** 将小圆点的图片用数组表示 */private ImageView[] imageViews;public NavigationPageChangeListener(ArrayList<View> pageViews, ImageView[] imageViews) {this.pageViews=pageViews;this.imageViews=imageViews;}@Overridepublic void onPageScrollStateChanged(int arg0) {}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageSelected(int position) {//当页面切换时设置导航点的状态setPointStatus(position);}//设置导航点的状态private void setPointStatus(int position) {position=position%pageViews.size();for (int i = 0; i < imageViews.length; i++) {imageViews[position].setBackgroundResource(R.mipmap.face_float_icon_on);// 不是当前选中的page。其小圆点设置为未选中的状态if (position != i) {imageViews[i].setBackgroundResource(R.mipmap.face_float_icon);}}}}

EventPagerAdapter.java类是viewpager的适配器。instantiateItem方法做了一些处理。使事实上现无限循环。

package com.duora.bobge.duoradeliverly_version2.adapter;import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;import java.util.ArrayList;/*** Created by bobge on 15/7/30.*/
public class EventPageAdapter extends PagerAdapter {private ArrayList<View> pageViews;public EventPageAdapter(ArrayList<View> pageViews) {this.pageViews=pageViews;}// 销毁position位置的界面@Overridepublic void destroyItem(View container, int position, Object object) {((ViewPager) container).removeView(pageViews.get(position%pageViews.size()));}// 获取当前窗口界面数@Overridepublic int getCount() {return Integer.MAX_VALUE;}// 初始化position位置的界面@Overridepublic Object instantiateItem(View v, int position) {try{//((ViewPager) arg0).addView(list.get(arg1),0);((ViewPager) v).addView((View)pageViews.get(position%pageViews.size()),0);}catch (Exception e) {// TODO: handle exception}return pageViews.get(position%pageViews.size());}@Overridepublic boolean isViewFromObject(View v, Object arg1) {return v == arg1;}@Overridepublic void startUpdate(View arg0) {}@Overridepublic int getItemPosition(Object object) {return super.getItemPosition(object);}}

布局:custom_viewpager.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"><!--带导航点的viewpager布局--><android.support.v4.view.ViewPagerandroid:id="@+id/viewPager_main"android:layout_width="match_parent"android:layout_height="match_parent"/><LinearLayoutandroid:id="@+id/viewGroup"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_centerHorizontal="true"android:layout_marginBottom="20dp"android:gravity="center_horizontal"android:orientation="horizontal" ></LinearLayout>
</RelativeLayout>

在activity的布局中仅仅须要导入上面那个布局就可以:

<include
    layout="@layout/custom_viewpager"
    android:id="@+id/myViewPager"
    android:layout_width="match_parent"
    android:layout_height="@dimen/viewpager_height"
    />

转载于:https://www.cnblogs.com/blfbuaa/p/7053141.html

封装一个ViewPager真正的实现图片无限循环滚动带导航点相关推荐

  1. JQuery图片无限循环滚动源码

    平常项目中经常用到图片循环滚动,所以就写些必要的CSS定位,JS基本算法,最后就封装成JQuery图片无限循环滚动插件类,其实本质上是li块无限循环滚动,li块里面不管是图片还是其它内容,都OK的. ...

  2. unity实现图片轮播效果_unity 背景无限循环滚动效果

    背景无限循环滚动效果如下示: 步骤如下: 导入背景图片后,设置图片的格式,如下图: 2.图片格式也可以设置是Texture格式,但是Wrap Mode 一定要是Repeat[重复发生]:然后记得App ...

  3. 【Android】ViewPager实现无限循环滚动

    最近做的一个项目,客户要求在ViewPager实现的主页面中滑动到最后一页后继续滑动能返回到第一页,也就是实现无限循环滚动,效果如下: 看了下ViewPager没有滑到尽头的回调方法,因此想到的解决方 ...

  4. 利用jQuery实现图片无限循环轮播(不借助于轮播插件)

    原来我主要是用Bootstrap框架或者swiper插件实现轮播图的功能,而这次是用jQuery来实现图片无限循环轮播! 用到的技术有:html.css.JavaScript(少).jQuery(主要 ...

  5. 文字/图片向上无限循环滚动

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  6. 实现一个横向无限循环滚动的单行弹幕效果

    本期将带领大家实现一个这样的效果,支持无限循环的单行弹幕效果. 实现思路分析 要实现上面的效果,我们先拆分下实现要素: 1.弹幕布局是从屏幕的右侧向左侧滚动,单个弹幕之间的间距是固定的(设计要求) 2 ...

  7. CSS实现图片无限循环无缝滚动

    实现代码 <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8& ...

  8. ios之实现自动无限循环滚动视图(1)

    ios之实现自动无限循环滚动视图(1) 前言 效果展示 功能 分析 全部代码 前言 ios实现无限循环滚动主要有两种办法,都利用了UIScrollView,第一种是创建一个很大的UIScrollVie ...

  9. Unity3d学习笔记-无限循环滚动背景(完整的商店广告牌组件)

    在游戏项目中我们常常看到商城的广告牌,几张广告图片循环滚动,类似跑马灯,现在我将讨论一种实现方法,并提供一个管理类,大家可以直接使用. 实现原理:背景图片循环滚动的原理很简单:两张图片向一个方向移动, ...

最新文章

  1. 《windows中GSX的管理》之四——cmware-cmd实例
  2. java多线程中的异常处理
  3. java 获取md5值报错_java获取文件的MD5值
  4. adonis.js mysql_Adonis.js——数据库基本操作
  5. 未与信任 SQL Server 连接相关联
  6. 编译C#和C++共存的解决方案的小结
  7. empty variable name
  8. 洛谷——P1116 车厢重组
  9. Consistent hashing
  10. cuda和cudnn各版本下载地址
  11. Google Chrome谷歌浏览器离完整离线安装包下载地址整理总汇
  12. linux 添加声卡驱动,操作手册:Linux系统安装声卡驱动
  13. java判断list中是否包含某个值_java判断list是否包含某个值
  14. Window10 Excel复制粘贴卡死
  15. Freemarker 之ftl
  16. lucene使用facet搜索
  17. 报错PyTorch is not compiled with NCCL support
  18. ubuntu18.04根目录已满造成开机失败报错Fail to start....
  19. 一度智信:电商网店推广技巧分享
  20. 使用UltraISO制作纯U盘引导,UEFI安装win10[单文件超过4G]

热门文章

  1. 灯泡四个闪烁c语言程序设计教程课后答案,c语言编程题及答案4.doc
  2. 汇编语言重写除零中断
  3. solr5.3.1 mysql_Solr5.3.1 dataimport 导入mysql数据
  4. oracle日志版本不同步,oracle11GR2 datagurad 配置后,敲入日志应用后查看归档日志序号不一致...
  5. Mask R-CNN详解
  6. [机器学习]回归--(Simple LR and Multiple LR)
  7. TensorFlow(二)函数基础
  8. lime 深度学习_用LIME解释机器学习预测并建立信任
  9. 多目标分类的混淆矩阵_用于目标检测的混淆矩阵
  10. 机器学习 对模型进行惩罚_使用Streamlit对机器学习模型进行原型制作