相信做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