CoordinatorLayout AppBarLayout 標題漸變 懸浮

先直接上圖看效果:

WeChat_20170916214217_20170916214334.gif

項目需求:

滑動的時候標題漸變顏色浑塞,并且左右兩邊的圖片漸變切換郑叠。并且Toolbar能夠懸浮置頂膏燕,查閱了一些資料有用ScrollView實現(xiàn) 有用CoordinatorLayout +AppBarLayout +CollapsingToolbarLayout +Toolbar 實現(xiàn)第焰,沒錯我用的就是后者咽袜,其實實現(xiàn)了也就是這么回事,蠻簡單的盅视。

所以寫下博客捐名,一個是幫助其他小伙伴,另外一個是記錄下自己的菜鳥成長之路吧闹击。也決定之后有空了,把自己過去在項目中遇到的問題都記錄下來镶蹋,做成筆記。

實現(xiàn)原理:

為什么要用CoordinatorLayout CollapsingToolbarLayout是用來對Toolbar進行再次包裝的ViewGroup,主要是用于實現(xiàn)折疊(其實就是看起來像伸縮~)的App Bar效果贺归。它需要放在AppBarLayout布局里面淆两,并且作為AppBarLayout的直接子View。就不做過多解釋了不懂的可以看下這邊文章 玩轉(zhuǎn)AppBarLayout更酷炫的頂部欄

貼上代碼:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

        <variable
            name="ShopDetailsAcitvity"
            type="com.example.youjia.shopping.MainActivity" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <android.support.design.widget.CoordinatorLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1">

            <android.support.design.widget.AppBarLayout
                android:id="@+id/app_bar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <android.support.design.widget.CollapsingToolbarLayout
                    android:id="@+id/toolbar_layout"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="#f7f7f7"
                    app:contentScrim="?attr/colorPrimary"
                    app:layout_scrollFlags="scroll|exitUntilCollapsed">


                    <RelativeLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:background="@color/view"
                        android:orientation="vertical">


                        <RelativeLayout
                            android:id="@+id/banner_layout"
                            android:layout_width="match_parent"
                            android:layout_height="264dp"
                            android:orientation="vertical">

                            <com.youth.banner.Banner
                                android:id="@+id/banner"
                                android:layout_width="match_parent"
                                android:layout_height="match_parent"
                                app:image_scale_type="center_crop"
                                app:indicator_drawable_selected="@mipmap/banner_red"
                                app:indicator_drawable_unselected="@mipmap/banner_grey"
                                app:indicator_height="9dp"
                                app:indicator_margin="3dp"
                                app:indicator_width="9dp"
                                app:is_auto_play="true" />

                            <View
                                style="@style/View"
                                android:layout_alignParentBottom="true" />
                        </RelativeLayout>

                        <RelativeLayout
                            android:id="@+id/relativelayout_goods"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_below="@+id/banner_layout"
                            android:background="@color/white"
                            android:gravity="center_vertical"
                            android:paddingBottom="12dp"
                            android:paddingLeft="13.3dp"
                            android:paddingRight="13.3dp"
                            android:paddingTop="12dp">

                            <TextView
                                android:text="祿福來精品翡翠"
                                android:id="@+id/shop_details_1"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:lineSpacingExtra="5dp"
                                android:textColor="#282828"
                                android:textSize="16sp" />

                            <TextView
                                android:text="¥399.00"
                                android:id="@+id/shop_details_2"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_below="@+id/shop_details_1"
                                android:layout_marginTop="10dp"
                                android:textColor="#e75446"
                                android:textSize="16sp" />

                            <TextView
                                android:text="原價¥500.00"
                                android:id="@+id/shop_details_3"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_below="@+id/shop_details_2"
                                android:layout_marginTop="10dp"
                                android:textColor="#999999"
                                android:textSize="12sp" />
                            <!--android:layout_alignBottom="@+id/shop_details_2"-->
                            <TextView
                                android:text="月銷8238筆"
                                android:id="@+id/sumSotre"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_alignParentBottom="true"
                                android:layout_alignParentRight="true"
                                android:textColor="#656565"
                                android:textSize="14sp" />


                        </RelativeLayout>



                        <LinearLayout
                            android:id="@+id/linearLayout_goods"
                            android:layout_width="match_parent"
                            android:layout_height="46.3dp"
                            android:layout_alignParentStart="true"
                            android:layout_below="@+id/relativelayout_goods"
                            android:layout_marginTop="19dp"
                            android:background="@drawable/ripple_item_white_bg"
                            android:gravity="center_vertical"
                            android:orientation="vertical">

                            <TextView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_marginLeft="13dp"
                                android:layout_weight="1"
                                android:gravity="center_vertical"
                                android:text="選擇:商品規(guī)格"
                                android:textColor="#282828"
                                android:textSize="15.3sp" />

                            <View style="@style/View" />

                        </LinearLayout>


                    </RelativeLayout>
                    <android.support.v7.widget.Toolbar
                        android:id="@+id/toolbaretail"
                        android:layout_width="match_parent"
                        android:layout_height="70dp"
                        app:layout_collapseMode="pin"
                        android:fitsSystemWindows="true"
                        android:paddingTop="15dp"
                        app:popupTheme="@style/ThemeOverlay.AppCompat.Dark" >

                        <ImageView
                            android:src="@mipmap/share_shop"
                            android:id="@+id/share_img"
                            android:layout_gravity="center|right"
                            android:layout_marginRight="15dp"
                            android:layout_marginTop="5dp"
                            android:layout_width="wrap_content"
                            android:layout_height="match_parent" />
                    </android.support.v7.widget.Toolbar>
                </android.support.design.widget.CollapsingToolbarLayout>

                <android.support.design.widget.TabLayout
                    android:id="@+id/infoPhoneTabLayou"
                    app:tabTextColor="#989898"
                    app:tabSelectedTextColor="#e91b04"
                    app:tabIndicatorColor="@color/tablayout"
                    app:tabBackground="@drawable/ripple_tab_bg"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"  >

                </android.support.design.widget.TabLayout>

                <View
                    android:background="@color/view"
                    android:layout_width="match_parent"
                    android:layout_height="1dp"/>
            </android.support.design.widget.AppBarLayout>


            <android.support.v4.widget.NestedScrollView
                android:id="@+id/NestedScrollView"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:overScrollMode="always"
                app:layout_behavior="@string/appbar_scrolling_view_behavior">



                    <com.example.youjia.shopping.WrapContentHeightViewPager
                        android:id="@+id/infoPhone_Fragment_pager"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        />


            </android.support.v4.widget.NestedScrollView>


        </android.support.design.widget.CoordinatorLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_alignParentBottom="true"
            android:background="@color/white"
            android:gravity="center_vertical"
            android:orientation="horizontal">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1.2"
                android:background="@drawable/ripple_item_white_bg"
                android:drawablePadding="2dp"
                android:drawableTop="@mipmap/shop_details_3"
                android:gravity="center_horizontal"
                android:text="店鋪"
                android:textColor="#656565"
                android:textSize="10sp" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1.2"
                android:background="@drawable/ripple_item_white_bg"
                android:drawablePadding="2dp"
                android:drawableTop="@mipmap/shop_details_4"
                android:gravity="center_horizontal"
                android:text="進貨單"
                android:textColor="#656565"
                android:textSize="10sp" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_gravity="center_vertical"
                android:layout_weight="1"
                android:background="#ff6554"
                android:drawablePadding="5dp"
                android:gravity="center"
                android:text="加入進貨單"
                android:textColor="#ffffff" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_gravity="center_vertical"
                android:layout_weight="1"
                android:background="#ff334c"
                android:drawablePadding="5dp"
                android:gravity="center"
                android:text="立即采購"
                android:textColor="#ffffff" />
        </LinearLayout>
    </LinearLayout>
</layout>



package com.example.youjia.shopping;

import android.databinding.DataBindingUtil;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;


import com.example.youjia.shopping.databinding.ActivityMainBinding;

import java.util.ArrayList;
import java.util.List;


public class MainActivity extends AppCompatActivity {
    private ActivityMainBinding mBinding;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         mBinding  = DataBindingUtil.setContentView(this,R.layout.activity_main);
        mBinding.setShopDetailsAcitvity(this);
        mBinding.shopDetails3.getPaint().setFlags(Paint. STRIKE_THRU_TEXT_FLAG);
        TabLayout();
        initBanner();
        setToolBar();
    }

    /**
     * 初始化輪播圖
     */
    private void initBanner() {
        List<Integer> integers = new ArrayList<>();
        integers.add(R.drawable.img1);
        integers.add(R.drawable.img2);
        integers.add(R.drawable.img3);
//        integers.add(R.drawable.img4);
//        integers.add(R.drawable.img5);
//        integers.add(R.drawable.img6);
//        integers.add(R.drawable.img7);

        mBinding.banner.startAutoPlay();
        mBinding.banner.setDelayTime(2000);
        mBinding.banner.setImages(integers).setImageLoader(new GlideImageLoader()).start();
    }

    /**
     * 初始化setToolBar
     */
    private void setToolBar(){
        setSupportActionBar(mBinding.toolbaretail);
        mBinding.toolbaretail.setTitleTextColor(Color.WHITE);
        mBinding.toolbarLayout.setTitleEnabled(false);
        mBinding.toolbarLayout.setExpandedTitleGravity(Gravity.CENTER);//設置展開后標題的位置
        mBinding.toolbarLayout.setCollapsedTitleGravity(Gravity.CENTER);//設置收縮后標題的位置
        mBinding.toolbarLayout.setExpandedTitleColor(Color.WHITE);//設置展開后標題的顏色
        mBinding.toolbarLayout.setCollapsedTitleTextColor(Color.WHITE);//設置收縮后標題的顏色
        mBinding.appBar.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
            @Override
            public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
                //verticalOffset  當前偏移量 appBarLayout.getTotalScrollRange() 最大高度 便宜值
                int Offset = Math.abs(verticalOffset); //目的是將負數(shù)轉(zhuǎn)換為絕對正數(shù)拂酣;
                //標題欄的漸變
                mBinding.toolbaretail.setBackgroundColor(changeAlpha(getResources().getColor(R.color.redcustom)
                        , Math.abs(verticalOffset * 1.0f) / appBarLayout.getTotalScrollRange()));

                /**
                 * 當前最大高度便宜值除以2 在減去已偏移值 獲取浮動 先顯示在隱藏
                 */
                if (Offset < appBarLayout.getTotalScrollRange() / 2) {
                    mBinding.toolbaretail.setTitle("");
                    mBinding.toolbaretail.setAlpha((appBarLayout.getTotalScrollRange() / 2 - Offset * 1.0f) / (appBarLayout.getTotalScrollRange() / 2));
                    mBinding.shareImg.setAlpha((appBarLayout.getTotalScrollRange() / 2 - Offset * 1.0f) / (appBarLayout.getTotalScrollRange() / 2));
                    mBinding.shareImg.setImageDrawable(getResources().getDrawable(R.mipmap.share_shop));
                    mBinding.toolbaretail.setNavigationIcon(R.mipmap.shop_details_2);
                    /**
                     * 從最低浮動開始漸顯 當前 Offset就是  appBarLayout.getTotalScrollRange() / 2
                     * 所以 Offset - appBarLayout.getTotalScrollRange() / 2
                     */
                } else if (Offset > appBarLayout.getTotalScrollRange() / 2) {
                    float floate = (Offset - appBarLayout.getTotalScrollRange() / 2) * 1.0f / (appBarLayout.getTotalScrollRange() / 2);
                    mBinding.toolbaretail.setAlpha(floate);
                    mBinding.shareImg.setAlpha(floate);
                    mBinding.toolbaretail.setNavigationIcon(R.mipmap.image_left);
                    mBinding.shareImg.setImageDrawable(getResources().getDrawable(R.mipmap.img_share));
                    mBinding.toolbaretail.setTitle("祿福來精品翡翠");
                    mBinding.toolbaretail.setAlpha(floate);
                }
            }
        });
    }

    /**
     * 根據(jù)百分比改變顏色透明度
     */
    public int changeAlpha(int color, float fraction) {
        int alpha = (int) (Color.alpha(color) * fraction);
        return Color.argb(alpha, 0, 128, 0);
    }

    /**TabLayout
     * 初始化
     */
    private void TabLayout(){
        List<String>list_Title = new ArrayList<>();
        list_Title.add("圖文詳情");
        list_Title.add("規(guī)格參數(shù)");

        List<Fragment> fragmentList = new ArrayList<>();
        fragmentList.add(new Fragment1());
        fragmentList.add(new Fragment2());

        mBinding.infoPhoneFragmentPager.setAdapter(new HomeFragmentPageAdapter(getSupportFragmentManager(),fragmentList,list_Title,2));
        mBinding.infoPhoneTabLayou.setTabMode(TabLayout.MODE_FIXED);
        mBinding.infoPhoneTabLayou.setupWithViewPager(mBinding.infoPhoneFragmentPager);
    }
}

漸變核心實現(xiàn)AppBarLayout.addOnOffsetChangedListener監(jiān)聽
通過verticalOffset 拿到當前的當前偏移量,appBarLayout.getTotalScrollRange() 是最大高度 偏移值 有了這兩個參數(shù)我們就可以計算 浮度

是不是感覺很簡單呢到此就結(jié)束了秋冰,在此奉上源碼點擊下載
有更好的方式或者需要改進的地方請給我留言,大家共同學習進步婶熬。
圖片是一個做微商朋友提供的剑勾,要是需要玉的話可以給我留言。就當給他推廣推廣啦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赵颅,一起剝皮案震驚了整個濱河市虽另,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌饺谬,老刑警劉巖捂刺,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異募寨,居然都是意外死亡族展,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門绪商,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苛谷,“玉大人,你說我怎么就攤上這事格郁「沟睿” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵例书,是天一觀的道長锣尉。 經(jīng)常有香客問我,道長决采,這世上最難降的妖魔是什么自沧? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮树瞭,結(jié)果婚禮上拇厢,老公的妹妹穿的比我還像新娘。我一直安慰自己晒喷,他們只是感情好孝偎,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凉敲,像睡著了一般衣盾。 火紅的嫁衣襯著肌膚如雪寺旺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天势决,我揣著相機與錄音阻塑,去河邊找鬼。 笑死果复,一個胖子當著我的面吹牛陈莽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播据悔,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼传透,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了极颓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤群嗤,失蹤者是張志新(化名)和其女友劉穎菠隆,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狂秘,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡骇径,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了者春。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片破衔。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖钱烟,靈堂內(nèi)的尸體忽然破棺而出晰筛,到底是詐尸還是另有隱情,我是刑警寧澤拴袭,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布读第,位于F島的核電站,受9級特大地震影響拥刻,放射性物質(zhì)發(fā)生泄漏怜瞒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一般哼、第九天 我趴在偏房一處隱蔽的房頂上張望吴汪。 院中可真熱鬧,春花似錦蒸眠、人聲如沸漾橙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽近刘。三九已至擒贸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間觉渴,已是汗流浹背介劫。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留案淋,地道東北人座韵。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像踢京,于是被迫代替她去往敵國和親誉碴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

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