相信做app应用开发的,绝对都接触过ViewPager,毕竟ViewPager的应用可以说无处不在;APP第一次启动时的新手导航页,APP中结合Fragment实现页面滑动,APP中常见的广告栏的自动滑动(也可手动滑动)。 ViewPager有这么多好处,在APP中到处都可能会用到,那大家岂不是要写好多重复的代码呢?
作为有思想的开发者,我们应当想到,把ViewPager封装起来,做成一个更好使用,更加强大的工具!

不多说,直接贴代码:

package com.lnyp.viewpagerhelper;

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.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout; import java.util.List;
import java.util.concurrent.atomic.AtomicInteger; /**
* ViewPager帮助类,可用于app的引导页,app的广告栏
**/
public class ViewPagerHelper {
// 判断是否自动滑动
private boolean mIsAuto; private ViewPager mViewPager; private List<View> mViews; private LinearLayout mIndicatorParents; // 指示器容器 private PagerAdapter mPagerAdapter; private int mSelect; private int mUnSelect; private OnViewInstantiateListener mOnViewInstantiateListener; // 一个提供原子操作的Integer的类
private AtomicInteger atomicInteger = new AtomicInteger(0); // 广告不停的循环播放
private boolean isContinue = true; /*
* 每隔固定时间切换广告栏图片
*/
private final Handler viewHandler = new Handler() { @Override
public void handleMessage(Message msg) {
if (msg.what == mViews.size()) {
mViewPager.setCurrentItem(1);
} else {
mViewPager.setCurrentItem(msg.what);
} super.handleMessage(msg);
} }; /**
* View 被附加到viewpager的时候调用
*/
public interface OnViewInstantiateListener {
public void onInstantiate(int position, View view);
} /**
* @param isAuto 指定该ViewPager中的内容是否自动滑动,true为自动滑动,false为手动滑动
* @param viewPager
* @param views 加载到ViewPager中的View的集合
* @param indicatorParents 导航页下面小圆点的父容器
* @param selectDrawableRes 选中页显示的导航点的图片
* @param unselectDrawableRes 未选中页的导航点的图片
*/
public ViewPagerHelper(boolean isAuto, ViewPager viewPager, List<View> views, LinearLayout indicatorParents,
int selectDrawableRes, int unselectDrawableRes) {
mIsAuto = isAuto;
mViewPager = viewPager;
mViews = views;
mIndicatorParents = indicatorParents;
mSelect = selectDrawableRes;
mUnSelect = unselectDrawableRes; init();
} /**
* 设置atomicInteger
*/
private void atomicOption() {
atomicInteger.incrementAndGet();
if (atomicInteger.get() > mViews.size() - 1) {
atomicInteger.getAndAdd(-mViews.size());
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
} public ViewPager getViewPager() {
return mViewPager;
} public List<View> getViews() {
return mViews;
} public void setOnViewInstantiateListener(OnViewInstantiateListener listener) {
mOnViewInstantiateListener = listener;
} /**
*
*/
private void init() {
mPagerAdapter = new PagerAdapter() {
@Override
public int getCount() {
return mViews.size();
} @Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == (arg1);
} @Override
public int getItemPosition(Object object) {
View view = (View) object;
if (mViews.contains(view)) {
return mViews.indexOf(view);
} return POSITION_NONE;
} @Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(mViews.get(position));// 删除页卡
} @Override
public Object instantiateItem(ViewGroup container, int position) {
View view = mViews.get(position);
container.addView(view, 0); if (mOnViewInstantiateListener != null) {
mOnViewInstantiateListener.onInstantiate(position, view);
} return mViews.get(position);
}
}; mViewPager.setAdapter(mPagerAdapter); mViewPager.addOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
// 从1到2滑动,在1滑动前调用
} @Override
public void onPageSelected(int position) {
// activity从1到2滑动,2被加载后掉用此方法
switchBannerIndicator(position);
} @Override
public void onPageScrollStateChanged(int state) {
// 状态有三个0空闲,1是正在滑行中,2目标加载完毕
}
}); if (mIndicatorParents != null) {
for (int i = 0; i < mViews.size(); i++) {
// 导航点直接的间距
int margin = 20; // 设置未选中的也没的导航点的图片
ImageView view = new ImageView(mViewPager.getContext());
view.setBackgroundResource(mUnSelect); // 设置图片的属性
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); if (i < mViews.size() - 1) {
params.rightMargin = margin;
} // 将导航点加入到容器中
mIndicatorParents.addView(view, params);
}
// 单独设置选中的导航点的图片
mIndicatorParents.getChildAt(0).setBackgroundResource(mSelect);
} /**
* 判断是否自动更新View
*/
if (mIsAuto) {
// 启动线程,定时更改View
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
if (isContinue) {
viewHandler.sendEmptyMessage(atomicInteger.get());
atomicOption();
}
}
}
}).start();
} } /**
* 设置指示器当前页码
*/
private void switchBannerIndicator(int index) {
if (mIndicatorParents != null) {
for (int i = 0; i < mIndicatorParents.getChildCount(); i++) {
View view = mIndicatorParents.getChildAt(i);
if (i == index) {
view.setBackgroundResource(mSelect);
} else {
view.setBackgroundResource(mUnSelect);
}
}
}
}
}

代码中注释已经很详细了,不多解释,下面来看看如何使用该ViewPagerHelper,我们用它来试下你APP的新手导航页:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"> <android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="fill_parent"
android:layout_height="fill_parent" /> <LinearLayout
android:id="@+id/dots_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:gravity="center"
android:layout_marginBottom="20dp"
android:orientation="horizontal" /> </RelativeLayout>

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout; import java.util.ArrayList;
import java.util.List; import butterknife.Bind;
import butterknife.ButterKnife; /**
* 新手导航页
*
* @author lining
*/
public class GudieActivity extends Activity { private List<View> views = null; @Bind(R.id.viewpager)
public ViewPager mViewPager;
@Bind(R.id.dots_parent)
public LinearLayout viewPoints; @Override
protected void onCreate(Bundle savedInstanceState) {
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState); setContentView(R.layout.activity_guide); ButterKnife.bind(this); this.initDatas();
} /**
* 初始化数据
*/
private void initDatas() {
views = new ArrayList<View>(); View view1 = LayoutInflater.from(this).inflate(R.layout.page_guide_first, null);
View view2 = LayoutInflater.from(this).inflate(R.layout.page_guide_second, null);
View view3 = LayoutInflater.from(this).inflate(R.layout.page_guide_third, null); views.add(view1);
views.add(view2);
views.add(view3); view3.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(GudieActivity.this, MainActivity.class);
GudieActivity.this.startActivity(intent); GudieActivity.this.finish();
}
}); new ViewPagerHelper(true, mViewPager, views, viewPoints, R.mipmap.page_indicator_focused,
R.mipmap.page_indicator_unfocused);
}
}

注: 请着重看下这行代码:

new ViewPagerHelper(false, mViewPager, views, viewPoints, R.mipmap.page_indicator_focused, R.mipmap.page_indicator_unfocused);

没错,使用ViewPagerHelper就这么简单的一句!!! 只要把需要的参数传递过去即可啦,看下效果:

有没有被惊艳到?

好吧,确实没啥惊艳的,哈哈,不过我想,该工具类确实能很好的帮助大家精简以后的开发工作!

实例源码下载地址(免费):http://download.csdn.net/detail/zuiwuyuan/9212197

ViewPager封装工具类: 轻松实现APP导航或APP中的广告栏的更多相关文章

  1. JAVA之旅(五)——this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块

    JAVA之旅(五)--this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块 周末收获颇多,继续学习 一.this关键字 用于区分局部变量和成员变量同名的情况 ...

  2. Android OkHttp网络连接封装工具类

    package com.lidong.demo.utils; import android.os.Handler; import android.os.Looper; import com.googl ...

  3. 泛型(二)封装工具类CommonUtils-把一个Map转换成指定类型的javabean对象

    1.commons-beanutils的使用 commons-beanutils-1.9.3.jar 依赖 commons-logging-1.2.jar 代码1: String className ...

  4. MySQL JDBC常用知识,封装工具类,时区问题配置,SQL注入问题

    JDBC JDBC介绍 Sun公司为了简化开发人员的(对数据库的统一)操作,提供了(Java操作数据库的)规范,俗称JDBC,这些规范的由具体由具体的厂商去做 对于开发人员来说,我们只需要掌握JDBC ...

  5. 从零开始学android开发-通过WebService进行网络编程,使用工具类轻松实现

    相信大家在平常的开发中,对网络的操作用到HTTP协议比较多,通过我们使用Get或者Post的方法调用一个数据接口,然后服务器给我们返回JSON格式的数据,我们解析JSON数据然后展现给用户,相信很多人 ...

  6. 超简单的okhttp封装工具类(上)

      版权声明:转载请注明出处:http://blog.csdn.net/piaomiao8179 https://blog.csdn.net/piaomiao8179/article/details/ ...

  7. FTP上传-封装工具类

    import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...

  8. 创建Jdbc封装工具类

    jdbc.propertie url=jdbc:mysql:///empye user=root password=root driver=com.mysql.jdbc.Driver 读取资源文件  ...

  9. 单机版 RedisUtils({基本操作封装工具类})【三】

    <!--集成的RedisJAR--> <!--引入jedis需的jar包--> <dependency> <groupId>redis.clients& ...

随机推荐

  1. 易语言连接RCON详细教程实例(演示连接Unturned服务器RCON)

    一.准备工作 工 具: 1.易语言 2.RCON服务端(这里我使用unturned服务器的RCON作为演示) 二.启动Unturned服务器并配置RCON 打开unturned服务器路径:F:\Unt ...

  2. Leetcode581.Shortest Unsorted Continuous Subarray最短无序连续子数组

    给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序. 你找到的子数组应是最短的,请输出它的长度. 示例 1: 输入: [2, 6, 4, 8, 1 ...

  3. WordPress不同分类使用不同的文章模板

    倡萌昨天分享的 Custom Post Template 和 Single Post Template 可以让你自定义每篇文章的文章模板,今天来说说WordPress不同分类使用不同的文章模板. 方法 ...

  4. 阿里云杨敬宇:5G时代,边缘计算将发挥更大价值

    “5G时代,边缘计算将发挥更大价值.”3月8日,阿里云边缘计算技术负责人杨敬宇向媒体表示,边缘计算作为5G时代的一项关键技术,未来将成为不可或缺的基础设施之一. 5G时代万物智联将真正成为现实,但对计 ...

  5. pycharm 测试执行成功,但却无法成功生成测试报告(使用HTMLTestRunner)的解决办法

    pycharm 测试执行成功,在对应的测试路径下确未生成测试报告.反复确认代码也是没有问题的,在网上查找了原因:简单的unittest运行是不执行main方法的.是允许方式问题. 于是在mian方法里 ...

  6. locationManager 回调方法不调用问题?

    当locationManager都设置好了后开始定位服务后回调方法didUpdateToLocation不调用 [_locationManager setDelegate:self]; [_locat ...

  7. LintCode刷题笔记-- Distinct Subsequences

    标签:动态规划 题目描述: Given a string S and a string T, count the number of distinct subsequences of T in S. ...

  8. 为什么无法定义1px左右高度的容器

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  9. 使用DIV+CSS布局网站的优点和缺陷

    随着WEB2.0标准化设计理念的普及,国内很多大型门户网站已经纷纷采用DIV+CSS制作方法,从实际应用情况来看,此种方法绝对好于表格制作页面的方法. 如今大部分网站仍然采用表格嵌套内容的方式来制作网 ...

  10. mac pro 1.5T内存是如何实现的

    苹果发布全新Mac Pro:28核1.5T内存 预计售价10万+ 看到这样的新闻标题是不是很震撼,甚至怀疑人生,64位机怎么就可以1.5T内存了,自己的系统盘都没那么大 而且我们知道windows下的 ...