2019-05-14

ViewPager的詳細(xì)介紹

?簡(jiǎn)介

Viewpager,視圖翻頁(yè)工具,提供了多頁(yè)面切換的效果。Android 3.0后引入的一個(gè)UI控件,位于v4包中。低版本使用需要導(dǎo)入v4包,但是現(xiàn)在我們開(kāi)發(fā)的APP一般不再兼容3.0及以下的系統(tǒng)版本,另外現(xiàn)在大多數(shù)使用Android studio進(jìn)行開(kāi)發(fā),默認(rèn)導(dǎo)入v7包,v7包含了v4,所以不用導(dǎo)包,越來(lái)越方便了。

Viewpager使用起來(lái)就是我們通過(guò)創(chuàng)建adapter給它填充多個(gè)view,左右滑動(dòng)時(shí),切換不同的view。Google官方是建議我們使用Fragment來(lái)填充ViewPager的,這樣 可以更加方便的生成每個(gè)Page,以及管理每個(gè)Page的生命周期。


簡(jiǎn)單使用

1.xml的引用

<android.support.v4.view.ViewPager

android:id="@+id/vp"

android:layout_width="match_parent"

android:layout_height="match_parent">

</android.support.v4.view.ViewPager>

2.使用?

//找到控件

? ? ? ?ViewPager ? ?vp ?= (ViewPager) findViewById(R.id.vp);

//創(chuàng)建view集合

? ? ? ?Arraylist<View> mView = new ArrayList<>();

? ? ? ? //找到需要往view中添加的布局

? ? ? ? View viewone = LinearLayout.inflate(this, R.layout.vpone, null);

? ? ? ? View viewtwo = LinearLayout.inflate(this, R.layout.vptwo, null);

? ? ? ? View viewthree = LinearLayout.inflate(this, R.layout.vpthree, null);

? ? ? ? //添加

? ? ? ? mView.add(viewone);

? ? ? ? mView.add(viewtwo);

? ? ? ? mView.add(viewthree);

//viewpager的適配器(設(shè)配器單獨(dú)創(chuàng)建一個(gè)類去寫(xiě))

vp.setAdapter(new PagerAdapter() {

? ? ? ? ? ? @Override

? ? ? ? ? ? public int getCount() {

? ? ? ? ? ? ? ? return mView.size();

? ? ? ? ? ? }

? ? ? ? ? ? @Override

? ? ? ? ? ? public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {

? ? ? ? ? ? ? ? return view==object;

? ? ? ? ? ? }

? ? ? ? ? ? @Override

? ? ? ? ? ? public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {

? ? ? ? ? ? ? ? container.removeView(mView.get(position));

? ? ? ? ? ? }

? ? ? ? ? ? @NonNull

? ? ? ? ? ? @Override

? ? ? ? ? ? public Object instantiateItem(@NonNull ViewGroup container, int position) {

? ? ? ? ? ? ? ? ? ? ? ?View view = mView.get(position);

? ? ? ? ? ? ? ? ? ? ?container.addView(view);

? ? ? ? ? ? ? ? ? ? ? return view;

? ? ? ? ? ? }

? ? ? ? });

實(shí)現(xiàn)效果



翻頁(yè)動(dòng)畫(huà)

ViewPager有個(gè)方法叫做:

setPageTransformer(boolean reverseDrawingOrder, PageTransformer transformer) 用于設(shè)置ViewPager切換時(shí)的動(dòng)畫(huà)效果,并且google官方還給出了兩個(gè)示例(因?yàn)槭褂玫氖菍傩詣?dòng)畫(huà),所以不兼容3.0以下)。

1. DepthPageTransformer

public class DepthPageTransformer implements ViewPager.PageTransformer {

? ? private static final float MIN_SCALE = 0.75f;

? ? public void transformPage(View view, float position) {

? ? ? ? int pageWidth = view.getWidth();

? ? ? ? if (position < -1) { // [-Infinity,-1)

? ? ? ? ? ? // This page is way off-screen to the left.

? ? ? ? ? ? view.setAlpha(0);

? ? ? ? } else if (position <= 0) { // [-1,0]

? ? ? ? ? ? // Use the default slide transition when moving to the left page

? ? ? ? ? ? view.setAlpha(1);

? ? ? ? ? ? view.setTranslationX(0);

? ? ? ? ? ? view.setScaleX(1);

? ? ? ? ? ? view.setScaleY(1);

? ? ? ? } else if (position <= 1) { // (0,1]

? ? ? ? ? ? // Fade the page out.

? ? ? ? ? ? view.setAlpha(1 - position);

? ? ? ? ? ? // Counteract the default slide transition

? ? ? ? ? ? view.setTranslationX(pageWidth * -position);

? ? ? ? ? ? // Scale the page down (between MIN_SCALE and 1)

? ? ? ? ? ? float scaleFactor = MIN_SCALE

? ? ? ? ? ? ? ? ? ? + (1 - MIN_SCALE) * (1 - Math.abs(position));

? ? ? ? ? ? view.setScaleX(scaleFactor);

? ? ? ? ? ? view.setScaleY(scaleFactor);

? ? ? ? } else { // (1,+Infinity]

? ? ? ? ? ? // This page is way off-screen to the right.

? ? ? ? ? ? view.setAlpha(0);

? ? ? ? }

? ? }

}

調(diào)用

vp.setPageTransformer(false,new DepthPageTransformer());

實(shí)現(xiàn)效果


2. ZoomOutPageTransformer

public class ZoomOutPageTransformer implements ViewPager.PageTransformer

{

? ? private static final float MIN_SCALE = 0.85f;

? ? private static final float MIN_ALPHA = 0.5f;

? ? @SuppressLint("NewApi")

? ? public void transformPage(View view, float position)

? ? {

? ? ? ? int pageWidth = view.getWidth();

? ? ? ? int pageHeight = view.getHeight();

? ? ? ? Log.e("TAG", view + " , " + position + "");

? ? ? ? if (position < -1)

? ? ? ? { // [-Infinity,-1)

? ? ? ? ? ? // This page is way off-screen to the left.

? ? ? ? ? ? view.setAlpha(0);

? ? ? ? } else if (position <= 1) //a頁(yè)滑動(dòng)至b頁(yè) ; a頁(yè)從 0.0 -1 ;b頁(yè)從1 ~ 0.0

? ? ? ? { // [-1,1]

? ? ? ? ? ? // Modify the default slide transition to shrink the page as well

? ? ? ? ? ? float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));

? ? ? ? ? ? float vertMargin = pageHeight * (1 - scaleFactor) / 2;

? ? ? ? ? ? float horzMargin = pageWidth * (1 - scaleFactor) / 2;

? ? ? ? ? ? if (position < 0)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? view.setTranslationX(horzMargin - vertMargin / 2);

? ? ? ? ? ? } else

? ? ? ? ? ? {

? ? ? ? ? ? ? ? view.setTranslationX(-horzMargin + vertMargin / 2);

? ? ? ? ? ? }

? ? ? ? ? ? // Scale the page down (between MIN_SCALE and 1)

? ? ? ? ? ? view.setScaleX(scaleFactor);

? ? ? ? ? ? view.setScaleY(scaleFactor);

? ? ? ? ? ? // Fade the page relative to its size.

? ? ? ? ? ? view.setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE)

? ? ? ? ? ? ? ? ? ? / (1 - MIN_SCALE) * (1 - MIN_ALPHA));

? ? ? ? } else

? ? ? ? { // (1,+Infinity]

? ? ? ? ? ? // This page is way off-screen to the right.

? ? ? ? ? ? view.setAlpha(0);

? ? ? ? }

? ? }

}

調(diào)用

vp.setPageTransformer(false,new ZoomOutPageTransformer());

實(shí)現(xiàn)效果


3. 自定義動(dòng)畫(huà)

public class RotateDownPageTransformer implements ViewPager.PageTransformer {

? ? private static final float ROT_MAX = 20.0f;

? ? private float mRot;

? ? public void transformPage(View view, float position)

? ? {

? ? ? ? Log.e("TAG", view + " , " + position + "");

? ? ? ? if (position < -1)

? ? ? ? { // [-Infinity,-1)

? ? ? ? ? ? // This page is way off-screen to the left.

? ? ? ? ? ? view.setRotation(0);

? ? ? ? } else if (position <= 1) // a頁(yè)滑動(dòng)至b頁(yè) ; a頁(yè)從 0.0 ~ -1 ;b頁(yè)從1 ~ 0.0

? ? ? ? { // [-1,1]

? ? ? ? ? ? // Modify the default slide transition to shrink the page as well

? ? ? ? ? ? if (position < 0)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? mRot = (ROT_MAX * position);

? ? ? ? ? ? ? ? view.setPivotX(view.getMeasuredWidth() * 0.5f);

? ? ? ? ? ? ? ? view.setPivotY(view.getMeasuredHeight());

? ? ? ? ? ? ? ? view.setRotation( mRot);

? ? ? ? ? ? } else

? ? ? ? ? ? {

? ? ? ? ? ? ? ? mRot = (ROT_MAX * position);

? ? ? ? ? ? ? ? view.setPivotX(view.getMeasuredWidth() * 0.5f);

? ? ? ? ? ? ? ? view.setPivotY(view.getMeasuredHeight());

? ? ? ? ? ? ? ? view.setRotation( mRot);

? ? ? ? ? ? }

? ? ? ? ? ? // Scale the page down (between MIN_SCALE and 1)

? ? ? ? ? ? // Fade the page relative to its size.

? ? ? ? } else

? ? ? ? { // (1,+Infinity]

? ? ? ? ? ? // This page is way off-screen to the right.

? ? ? ? ? ? view.setRotation( 0);

? ? ? ? }

? ? }

}

實(shí)現(xiàn)效果


position說(shuō)明:

當(dāng)前顯示頁(yè)為0,前一頁(yè)為-1,后一頁(yè)為1,滑動(dòng)過(guò)程中數(shù)值不斷變大或變小,所以為float類型

翻頁(yè)監(jiān)聽(tīng)

vp.addOnPageChangeListener(newViewPager.OnPageChangeListener() {

@Override

publicvoidonPageScrolled(intposition,floatpositionOffset,intpositionOffsetPixels) {

Log.e("vp","滑動(dòng)中=====position:"+position+" ? positionOffset:"+positionOffset+" ? positionOffsetPixels:"+positionOffsetPixels);

}

@Override

publicvoidonPageSelected(intposition) {

Log.e("vp","顯示頁(yè)改變=====postion:"+position);

?? }

@Override

publicvoidonPageScrollStateChanged(intstate) {

switch(state) {

caseViewPager.SCROLL_STATE_IDLE:

Log.e("vp","狀態(tài)改變=====SCROLL_STATE_IDLE====靜止?fàn)顟B(tài)");

break;

caseViewPager.SCROLL_STATE_DRAGGING:

Log.e("vp","狀態(tài)改變=====SCROLL_STATE_DRAGGING==滑動(dòng)狀態(tài)");

break;

caseViewPager.SCROLL_STATE_SETTLING:

Log.e("vp","狀態(tài)改變=====SCROLL_STATE_SETTLING==滑翔狀態(tài)");

break;

? ? ?? }

?? }

});

1.onPageScrolled(int position, float positionOffset, int positionOffsetPixels)

頁(yè)面滑動(dòng)狀態(tài)停止前一直調(diào)用

position:當(dāng)前點(diǎn)擊滑動(dòng)頁(yè)面的位置?

positionOffset:當(dāng)前頁(yè)面偏移的百分比?

positionOffsetPixels:當(dāng)前頁(yè)面偏移的像素位置

2.onPageSelected(int position)

滑動(dòng)后顯示的頁(yè)面和滑動(dòng)前不同,調(diào)用

position:選中顯示頁(yè)面的位置

3.onPageScrollStateChanged(int state)

頁(yè)面狀態(tài)改變時(shí)調(diào)用

state:當(dāng)前頁(yè)面的狀態(tài)

SCROLL_STATE_IDLE:空閑狀態(tài)?

SCROLL_STATE_DRAGGING:滑動(dòng)狀態(tài)?

SCROLL_STATE_SETTLING:滑動(dòng)后滑翔的狀態(tài)

ViewPager+Fragment+Tablayout的使用

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?今天累了,下次再寫(xiě)?。?!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容