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

效果图:


大家在写项目的过程中常常会碰到须要实现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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252473.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

毕业论文页眉页脚页码插入

用word这么多年&#xff0c;第一次完整的操作了一遍页眉页脚页码的插入过程&#xff0c;其实三者都要要求奇偶页不同 1.页面布局-》右下角箭头-》版式-》奇偶页不同 因为文章不同的部分需要插入不同的页眉页脚页码&#xff0c;所以要在不同的部分插入分解符断开它们的连接 2、…

巴黎市中心降下2019年第一场雪

当地时间1月22日&#xff0c;法国巴黎市中心降下2019年第一场雪&#xff0c;气温也随之下降&#xff0c;街上的行人和车辆均有所减少。中新社记者 李洋 摄一对情侣在埃菲尔铁塔前合影留念。无家可归者在长椅上睡觉。游客在卢浮宫前拍照。

Echarts实现隐藏x轴,y轴,刻度线,网格

"yAxis": [{//就是一月份这个显示为一个线段&#xff0c;而不是数轴那种一个点点"show" : true,"boundaryGap": true,"type": "category","name": "时间","data": ["1月", "2…

Atom插件主题推荐

注意事项 主题和插件这方面,比 Sublime Text 人性化多了..一些比较用心的作者增加了二度设置功能。 何为二度设置,就是不用手写代码修改配置文件&#xff0c;点点鼠标&#xff0c;填填输入框就能生效&#xff0c;主题以 isotope-ui 这个做例子介绍,看图&#xff1a; 进入二度设…

印尼发生洪灾和山体滑坡 致多人死亡数千人撤离

当地时间1月23日&#xff0c;印尼南苏拉威西省望加锡居民受洪水影像&#xff0c;用竹筏运送摩托车。近日&#xff0c;印尼南苏拉威西省暴雨连连&#xff0c;造成洪灾和山体滑坡。目前&#xff0c;暴雨引发的洪灾和山体滑坡至少已造成8人死亡&#xff0c;数千人被迫撤离家园。。…

pycharm中无法import已经安装的ros中的库

使用pycharm写python程序&#xff0c;无法import 已经安装的ros包&#xff0c;并提示ImportError: No module named sensor_msgs.msg 解决方法如下 1. pycharm->file->settings->project:csvfile->project interpreter-> 点击右侧下三角选择 show all 2. 在弹…

tcp/ip知识点的总结

知识点搜集于网络&#xff0c;在加上自己的总结&#xff0c;还有很多不全&#xff0c;希望大家多提意见&#xff0c;共享学习&#xff01; 一、TCP/IP是什么&#xff1f; TCP/IP是一个协议族&#xff0c;而不是单独的协议。包括arp、ip、icmp、tcp、udp、http、ftp等协议 二、T…

imu_utils标定imu问题解决

在编译过程中遇到的一些问题可以参照这个女生的文章 https://blog.csdn.net/fang794735225/article/details/92804030 下面是imu_utils的主页&#xff0c;可以下载代码&#xff0c;也有使用步骤 https://github.com/gaowenliang/imu_utils 我下载了imu_utils主页最后面提供…

术语-服务:PaaS

ylbtech-术语-服务&#xff1a;PaaSPaaS是Platform-as-a-Service的缩写&#xff0c;意思是平台即服务。 把服务器平台作为一种服务提供的商业模式。通过网络进行程序提供的服务称之为SaaS(Software as a Service)&#xff0c;而云计算时代相应的服务器平台或者开发环境作为服务…

1.App瘦身经验总结

为什么apk越来越大&#xff1f; 1.项目不断发展&#xff0c;功能越多&#xff0c;代码量增加的同时&#xff0c;资源文件也在不断的增多2.app支持的主流dpi越来越多&#xff0c;如ldpi、mdpi、hdpi、xh xxh xxxh等等&#xff0c;间接导致资源增多3.引入的第三方sdk或开源库越来…

研究相机和IMU坐标系变换

刚开始录制的数据时没有考虑相机和IMU之间的坐标变换&#xff0c;但是后来发现跟踪效果不好&#xff0c;去查验imu数据时&#xff0c;发现&#xff0c;我采集保存的imu数据格式没有和euroc数据集中的imu数据保存格式统一&#xff0c;所以需要研究的是在euroc用于数据采集的设备…

第五天:Swift拖动 item 重排 CollectionView

参考链接:https://www.jianshu.com/p/96f956f1479e 1 import UIKit2 3 enum VC: String {4 case ViewController5 case CollectionViewController6 7 func segueIdentifier() -> String {8 switch self {9 case .ViewController:10 …

MIT Kimera阅读笔记

这两天在调研SLAM的最新算法&#xff0c;找到了2019CVPR上的一篇文章&#xff0c;出自于MIT&#xff0c;因为要给其他同事讲解&#xff0c;所以就把文章的重点内容在我个人理解的情况下翻译了出来&#xff0c;有理解不到位的还请各位大佬多多批评指正。 最后附上了Delaunay Tri…

YodaOS: 一个属于 Node.js 社区的操作系统

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; >>> 大家好&#xff0c;很开心在这里宣布 YodaOS开源了。他将承载 Rokid 4年以来对于人工智能和语音交互领域的沉淀&#xff0c;并选择 Node.js 作为操作系统的一等开发公民&#xff0…

Android顶部粘至视图具体解释

不知从某某时间開始&#xff0c;这样的效果開始在UI设计中流行起来了。让我们先来看看效果&#xff1a;大家在支付宝、美团等非常多App中都有使用。要实现这个效果&#xff0c;我们能够来分析下思路&#xff1a;我们肯定要用2个一样的布局来显示我们的粘至布局。一个是正常的、…

在实际项目开发中keil的调试方法

转载2015-06-14 20:23:04 一.在keilc的调试状态下&#xff0c;如何观察各个片内外设的运行状态&#xff1f;如何修改它们的设置&#xff1f;​ 在调试状态下&#xff0c;点击Peripherals菜单下的不同外设选项命令&#xff0c;就会显示或隐藏对应外设的观察窗口。 在程序运行时&…

小李飞刀:用python刷题ing....

叨逼叨 默认每天都要刷两道题。今天目标已完成。 第一题 26. 删除排序数组中的重复项难度&#xff1a;简单类型&#xff1a;数组 给定一个排序数组&#xff0c;你需要在原地删除重复出现的元素&#xff0c;使得每个元素只出现一次&#xff0c;返回移除后数组的新长度。不要使用…

VI-ORB环境配置

参考博客:https://blog.csdn.net/qq_38589460/article/details/82559816 https://blog.csdn.net/Robot_Starscream/article/details/90245456 本机安装的是opencv3.0 在Examples/ROS/ORB-VIO以及/VI-ORB/src/LearnVIORB-RT下的CMakeLists.txt都要进行修改 将find_package(O…

linux vg lv pv

pv由物理卷或者分区组成 pv可以组成一个或者多个vg vg可以分成多个lv 方便扩展 pvs vgs lvs 可以查看当前存在的pv vg lv 我的centos硬盘20g 使用了一段时间 加了100g 这时候 我们可以使用扩展来扩展我们的分区大小 查看自己拥有多少个硬盘 ls /dev/sd* | grep -v [0-9] …

mynt product model: D1000-IR-120标定相机和IMU外参

1. 首先是安装相应的mynt SDK. http://www.myntai.com/mynteye/depth小觅官网,在sdk下拉菜单中点击MYNT EYE Depth SDK,然后选择Linux Installation安装安装步骤说明一步步的安装,安装sample后,测试一下安装是否成功.我的电脑上安装了ROS,所以可以点击上面第一幅图中的ROS Ins…