CardView+ViewPager實現(xiàn)ViewPager翻頁動畫

皮一下才開心

huitouhuaji.gif

Viewpager通俗一點講就是一個允許左右翻轉(zhuǎn)帶數(shù)據(jù)的頁面的布局管理器,經(jīng)常用來連接Fragment薄货,它很方便管理每個頁面的生命周期昧捷,使用ViewPager管理Fragment是標準的適配器實現(xiàn)。最常用的實現(xiàn)一般有FragmentPagerAdapter和FragmentStatePagerAdapter更耻。自行百度它的用法。今天我們要實現(xiàn)的是下面的效果:

NO PICTURE TALK A JB

37bc57fa-4f31-4a77-98c7-20fc0174c58c.gif

要實現(xiàn)圖中的效果需要以下幾個知識點:
1.clipChildren屬性
2.一個頁面顯示多個ViewPager的Item
3.自定義PagerTransformer
4.ViewPager結(jié)合CardView

1.clipChildren 屬性

clipchildren :是否限制子View在其范圍內(nèi)罚渐,當(dāng)我們將其值設(shè)置為false后那么在子控件的高度高于父控件時也會完全顯示,而不會被壓縮却汉,(上面中間的按鈕超過上面的陰影線,依舊可以正常顯示)荷并,默認的時候是true合砂。


20170227143843131.png

了解了這個屬性就可以讓一個頁面顯示多個Viewpager的Item

2.一個頁面顯示多個ViewPager的Item

直接在xml布局文件中配置:android:clipToPadding="false"

<?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"
    android:background="@drawable/background">
    <!--1. 中間可滑動的viewPager-->
    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentBottom="true"
        android:clipToPadding="false"
        android:paddingEnd="48dp"
        android:paddingLeft="48dp"
        android:paddingRight="48dp"
        android:paddingStart="48dp" />
    <RelativeLayout
        android:id="@+id/bottom_layout"
        android:layout_width="match_parent"
        android:layout_height="55dp"
        android:layout_alignParentBottom="true">
        <ImageView
            android:id="@+id/img_like"
            android:layout_width="38dp"
            android:layout_height="38dp"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:src="@drawable/icon2" />
    </RelativeLayout>
    <TextView
        android:id="@+id/indicator_tv"
        android:layout_width="wrap_content"
        android:layout_height="20dp"
        android:layout_above="@+id/bottom_layout"
        android:layout_centerHorizontal="true"
        android:gravity="center_vertical"
        android:text="1/199"
        android:textColor="#ffffff"
        android:textSize="16sp" />
    <!--4. 頂部的titleBar-->
    <LinearLayout
        android:id="@+id/linearLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <!--沉浸式activity,這個view是用來占位的-->
        <View
            android:id="@+id/position_view"
            android:layout_width="1px"
            android:layout_height="1px" />
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="55dp"
            android:orientation="horizontal">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:text="地圖操作"
                android:textColor="#ffffff"
                android:textSize="16sp" />
        </RelativeLayout>
    </LinearLayout>
</RelativeLayout>

3.自定義ViewPager翻頁動畫

直接上代碼

public class CustPagerTransformer implements ViewPager.PageTransformer {
    private int maxTranslateOffsetX;
    private ViewPager viewPager;
    public CustPagerTransformer(Context context) {
        this.maxTranslateOffsetX = dp2px(context, 180);
    }
    public void transformPage(View view, float position) {
        if (viewPager == null) {
            viewPager = (ViewPager) view.getParent();
        }
        int leftInScreen = view.getLeft() - viewPager.getScrollX();
        int centerXInViewPager = leftInScreen + view.getMeasuredWidth() / 2;
        int offsetX = centerXInViewPager - viewPager.getMeasuredWidth() / 2;
        float offsetRate = (float) offsetX * 0.38f / viewPager.getMeasuredWidth();
        float scaleFactor = 1 - Math.abs(offsetRate);
        if (scaleFactor > 0) {
            view.setScaleX(scaleFactor);
            view.setScaleY(scaleFactor);
            view.setTranslationX(-maxTranslateOffsetX * offsetRate);
        }
    }
    /**
     * dp和像素轉(zhuǎn)換
     */
    private int dp2px(Context context, float dipValue) {
        float m = context.getResources().getDisplayMetrics().density;
        return (int) (dipValue * m + 0.5f);
    }
}
使用方法
// 1. viewPager添加parallax效果源织,使用PageTransformer就足夠了
      viewPager.setPageTransformer(false, new CustPagerTransformer(this));

4.CardView 與Viewpager聯(lián)合使用

先看viewpager的一個item布局

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <cn.yznu.gdmapoperate.ui.widget.AspectRatioCardView
        android:id="@+id/card_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginBottom="20dp"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        app:cardCornerRadius="5dp"
        app:cardElevation="6dp"
        app:cardMaxElevation="6dp">
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:background="@drawable/bg_map"
            android:contentDescription="@string/app_name"
            android:scaleType="centerCrop" />
        <ImageView
            android:id="@+id/image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:contentDescription="@string/app_name"
            android:scaleType="centerCrop"
            android:src="@drawable/map" />
        <TextView
            android:id="@+id/txt_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_gravity="bottom|center"
            android:padding="5dp"
            android:text="@string/app_name"
            android:textColor="#12edf0"
            android:textSize="15sp" />
    </cn.yznu.gdmapoperate.ui.widget.AspectRatioCardView>
</FrameLayout>

使用ViewPager管理Fragment是標準的適配器實現(xiàn),所以將這個xml作為fragment的布局就行了翩伪,就是這么簡單。
紅紅火火恍恍惚惚谈息,貌似完成了缘屹,就是這么簡單。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末侠仇,一起剝皮案震驚了整個濱河市轻姿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌傅瞻,老刑警劉巖踢代,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盲憎,死亡現(xiàn)場離奇詭異嗅骄,居然都是意外死亡,警方通過查閱死者的電腦和手機饼疙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門溺森,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人窑眯,你說我怎么就攤上這事屏积。” “怎么了磅甩?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵炊林,是天一觀的道長。 經(jīng)常有香客問我卷要,道長渣聚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任僧叉,我火速辦了婚禮奕枝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瓶堕。我一直安慰自己隘道,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谭梗,像睡著了一般忘晤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上默辨,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天德频,我揣著相機與錄音,去河邊找鬼缩幸。 笑死壹置,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的表谊。 我是一名探鬼主播钞护,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼爆办!你這毒婦竟也來了难咕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤距辆,失蹤者是張志新(化名)和其女友劉穎余佃,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體跨算,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡爆土,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了诸蚕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片步势。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖背犯,靈堂內(nèi)的尸體忽然破棺而出坏瘩,到底是詐尸還是另有隱情,我是刑警寧澤漠魏,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布倔矾,位于F島的核電站,受9級特大地震影響柱锹,放射性物質(zhì)發(fā)生泄漏哪自。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一奕纫、第九天 我趴在偏房一處隱蔽的房頂上張望提陶。 院中可真熱鬧,春花似錦匹层、人聲如沸隙笆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撑柔。三九已至瘸爽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铅忿,已是汗流浹背剪决。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留檀训,地道東北人柑潦。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像峻凫,于是被迫代替她去往敵國和親渗鬼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容