效果图:

大家在写项目的过程中常常会碰到须要实现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() {
@Override
public 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;
} @Override
public void onPageScrollStateChanged(int arg0) {
} @Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
} @Override
public 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位置的界面
@Override
public void destroyItem(View container, int position, Object object) { ((ViewPager) container).removeView(pageViews.get(position%pageViews.size()));
} // 获取当前窗口界面数
@Override
public int getCount() {
return Integer.MAX_VALUE;
} // 初始化position位置的界面
@Override
public 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());
} @Override
public boolean isViewFromObject(View v, Object arg1) {
return v == arg1;
} @Override
public void startUpdate(View arg0) {
} @Override
public 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.ViewPager
android:id="@+id/viewPager_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
/> <LinearLayout
android: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"
/>

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

  1. ViewPager,实现真正的无限循环(定时+手动)

    利用定时器,实现循环轮播,很简单:只需在定时器的消息里加如下代码即可: int count = adapter.getCount(); if (count > 1) { // 多于1个,才循环 ...

  2. Android实现ViewPager无限循环滚动回绕

     Android实现ViewPager无限循环滚动回绕 Android系统提供的ViewPager标准方式是左右可以自由滑动,但是滑动到最左边的极限位置是第一个page,滑动到最右边的位置是最后一 ...

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

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

  4. Android实现真正的ViewPager【平滑过渡】+【循环滚动】!!!顺带还有【末页跳转】。

    实现真正的ViewPager[平滑过渡]+[循环滚动]!!!顺带还有[末页跳转]. 首先呢, 我要对网上常见的3种ViewPager的循环滚动方法做个概述.急需看真正实现方法的同志请选择性忽略下面这一 ...

  5. unity 背景无限循环滚动效果

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

  6. 详细分析Android viewpager 无限循环滚动图片

    由于最近在忙于项目,就没时间更新博客了,于是趁着周日在房间把最近的在项目中遇到的技术总结下.最近在项目中要做一个在viewpager无限滚动图片的需求,其实百度一下有好多的例子,但是大部分虽然实现了, ...

  7. jquery的焦点图片无限循环关键思维

    在循环的时候,关键的是按(下一页按钮)到最后一页的时候和按(上一页按钮)到到第一页的时候如何转换: 首先必须知道3个js方法,prepend().append()和clone(); prepend() ...

  8. iOS无限循环滚动scrollview

    经常有园友会问"博主,有没有图片无限滚动的Demo呀?", 正儿八经的图片滚动的Demo我这儿还真没有,今天呢就封装一个可以在项目中直接使用的图片轮播.没看过其他iOS图片无限轮播 ...

  9. Cocos2dx中利用双向链表实现无限循环滚动层

    [Qboy原创] 在Cocos2dX 3.0 中已经实现一些牛逼的滚动层,但是对于有一些需要实现循环滚动的要求确没有实现,笔者在前段时间的一个做了一个游戏,需求是实现在少有的(13个)英雄中进行循环滚 ...

随机推荐

  1. C/C++ Quick Sort Algorithm

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50255069 快速排序算法,由C.A. ...

  2. Java 学习(10):java 异常处理

    java 异常处理 异常发生的原因有很多,通常包含以下几大类: 用户输入了非法数据. 要打开的文件不存在. 网络通信时连接中断,或者JVM内存溢出. 三种类型的异常: 检查性异常: 最具代表的检查性异 ...

  3. bzoj-1492 货币兑换Cash (1)——平衡树维护凸包

    题意: 有n天和m的初始金钱,用来购买AB两种纪念券: n天里每天都有AB的价格.每天能够进行这种操作. 1.卖出手中x%的纪念券(AB分别都卖出x%). 2.用x的金钱买入纪念券.买入AB券的比例在 ...

  4. 使用malloc分别分配2KB的空间,然后用realloc调整为6KB的内存空间,打印指针地址

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> i ...

  5. 蚁视新家show,小伙伴们快来增加有范儿有爱的蚁视大家庭吧!

    蚁视搬新家啦.新家在学院路上,离中关村非常近.离宇宙的中心非常近,离好多同学也非常近有木有! 新家绝对是超级创客范儿,绝对理想中的工作环境有木有!愿意增加蚁视的小伙伴们.快快来吧! 以下是蚁视新办公室 ...

  6. 343D/Codeforces Round #200 (Div. 1) D. Water Tree dfs序+数据结构

    D. Water Tree   Mad scientist Mike has constructed a rooted tree, which consists of n vertices. Each ...

  7. UVALive 4225 / HDU 2964 Prime Bases 贪心

    Prime Bases Problem Description Given any integer base b >= 2, it is well known that every positi ...

  8. validform

    一.validform是什么?            validform是一款智能的表单验证js插件,它是基于jQuery库与css,我们只需要把表单对象放入,             就可以对整个表 ...

  9. Java7里try-with-resources分析--转

    原文地址:http://blog.csdn.net/hengyunabc/article/details/18459463 这个所谓的try-with-resources,是个语法糖.实际上就是自动调 ...

  10. 【算法】prim算法(最小生成树)(与Dijkstra算法的比较)

    最小生成树: 生成树的定义:给定一个无向图,如果它的某个子图中任意两个顶点都互相连通并且是一棵树,那么这棵树就叫做生成树.(Spanning Tree) 最小生成树的定义:在生成树的基础上,如果边上有 ...