相信做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);
}
}
注: 请着重看下这行代码:
没错,使用ViewPagerHelper就这么简单的一句!!! 只要把需要的参数传递过去即可啦,看下效果:new ViewPagerHelper(false, mViewPager, views, viewPoints, R.mipmap.page_indicator_focused, R.mipmap.page_indicator_unfocused);
有没有被惊艳到?
好吧,确实没啥惊艳的,哈哈,不过我想,该工具类确实能很好的帮助大家精简以后的开发工作!
实例源码下载地址(免费):http://download.csdn.net/detail/zuiwuyuan/9212197