模仿手機淘寶 標(biāo)題效果 android

前陣子贞瞒,有個朋友讓我看手機淘寶app 我的淘寶,我的淘寶泪掀,那個可以滑動用戶名。他們公司要用垃环,他要做ios的可是我看到這個效果第一反應(yīng)是邀层,這不就是,android5.0的一個控件嗎晴裹?沒錯就是coordinatorlayout behavior 各種頭部動畫被济,都可以他寫,關(guān)于涧团,hehavior的帖子很多了只磷。我就不在這里介紹了,大家可以隨意百度看解釋泌绣。
我們先看钮追,最終效果圖。有圖有真相阿迈。

雖然有水印元媚,我已經(jīng)盡力了

是不是,有點像苗沧,我必須說明刊棕,我是在源文件基礎(chǔ)上修改來的,這貼出來待逞,原作者的git下載地址 :githup(雖然這個大牛也一定不會理我甥角,但是做人要有道德)
其實如果你去他的githup看了。你就會發(fā)現(xiàn)我做的工作其實并不對识樱,沒事嗤无,真心不多,我就添加了一個toolbar怜庸,修來原有代碼不超過五行当犯。是不是感覺有了互聯(lián)網(wǎng),我這種渣渣也能變成了割疾。過程不重要嚎卫,思路很重要。下來我們來看看具體我都修改了那些地方宏榕。

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:ignore="RtlHardcoded">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/main.appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/main.collapsing"
            android:layout_width="match_parent"
            android:layout_height="300dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">

            <ImageView
                android:id="@+id/main.imageview.placeholder"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scaleType="centerCrop"
                android:src="@drawable/quila2"
                android:tint="#11000000"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.9"

                />
//其實這個framelayout 已經(jīng)沒有什么用了驰凛。他的作用就是,一個高度展位担扑,懶了一下恰响,沒有調(diào)整。哈哈哈涌献。
            <FrameLayout
                android:id="@+id/main.framelayout.title"
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:layout_gravity="bottom|center_horizontal"
                android:background="@color/primary"
                android:orientation="vertical"
                android:visibility="invisible"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.3">


            </FrameLayout>
//我添加的一個toolbar 其實就是再貼胚宦,修改了一下
            <android.support.v7.widget.Toolbar
                android:id="@+id/tools"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="@color/cardview_light_background"
                app:contentInsetLeft="0dp"
                app:contentInsetStart="0dp"
                app:layout_collapseMode="pin">

                <LinearLayout
                    android:id="@+id/main.textview.title"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@color/cardview_light_background"
                    android:gravity="center"
                    android:orientation="vertical">
//這里修改的是一個高度,就是這是這里,枢劝,井联,設(shè)置最終的高度,
                    <de.hdodenhof.circleimageview.CircleImageView
                        android:layout_width="@dimen/image_final_width"
                        android:layout_height="@dimen/image_final_width"
                        android:layout_gravity="center_horizontal"
                        android:src="@drawable/quila"
                        app:border_color="@android:color/holo_green_dark"
                        app:border_width="2dp"

                        />

                </LinearLayout>
            </android.support.v7.widget.Toolbar>
        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>


    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="none"
        app:behavior_overlapTop="30dp"
        android:background="@color/cardview_light_background"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"

        >

        <android.support.v7.widget.CardView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="8dp"
            app:cardElevation="8dp"
            app:contentPadding="16dp">

            <TextView
                android:id="@+id/textView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:lineSpacingExtra="8dp"
                android:text="@string/lorem"
                android:textSize="18sp" />
        </android.support.v7.widget.CardView>


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

//注意看您旁,我隱藏掉了 toolbar烙常,但是并沒有g(shù)one他,因為還是要讓他鹤盒,占位置蚕脏,讓我的小頭像跟隨
    <android.support.v7.widget.Toolbar
        android:id="@+id/main.toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/cardview_light_background"
        app:contentInsetLeft="0dp"
        app:contentInsetStart="0dp"
        app:layout_anchor="@id/main.framelayout.title"
        app:layout_collapseMode="pin"
        android:visibility="invisible"
        app:theme="@style/ThemeOverlay.AppCompat.Dark"
        app:title="">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:orientation="horizontal"

            >

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_marginLeft="8dp"
                android:gravity="center_vertical"
                android:text="@string/quila_name2"
                android:textColor="@android:color/white"
                android:textSize="20sp" />

        </LinearLayout>
    </android.support.v7.widget.Toolbar>


        <de.hdodenhof.circleimageview.CircleImageView
            android:layout_width="@dimen/image_width"
            android:layout_height="@dimen/image_width"
            android:layout_gravity="center_horizontal"
            android:src="@drawable/quila"
            app:border_color="@android:color/holo_red_dark"
            app:border_width="2dp"
            app:finalHeight="@dimen/image_final_width"
            app:finalYPosition="2dp"
            app:layout_behavior="saulmm.myapplication.AvatarImageBehavior"
            app:startHeight="2dp"
            app:startToolbarPosition="2dp"
            app:startXPosition="2dp" />


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

其實就是一個道理,真亦假時假亦真侦锯,看到的不一定是真實的驼鞭。都是虛幻,哈哈尺碰。也是之前看到挣棕,另一個大牛,寫爆炸android特效經(jīng)常用的亲桥,貫徹他的思路洛心,我才能想到這個偷懶的方法卿吐。講講我的思路:

我們利用原有的toolbar作為脂凶,小頭像的移動依靠原杂,當(dāng)小頭像移動到我們自己添加toolbar的位置的時候早抠,將我們我們的toolbar顯示出來。

有人會提問嘁酿,這尼瑪在逗我嗎?你這樣隱藏顯示的,有什么意義户辫?

原因是這樣的:因為布局的原因。android5.0的toolbar 一定必須是頂層的吧嗤锉。你的所有內(nèi)容都應(yīng)該是在他下面的吧渔欢。按照這個思路,我們就知道瘟忱,其實奥额,為什么沒有隱藏小頭像的原因,那就是访诱,我們把自己toolbar顯示出來就是垫挨,為了壓蓋這原有的小頭像。為了達(dá)到和淘寶的效果一樣触菜,一瞬間掩藏九榔。你會感覺,小頭像是流暢的跑到了toolbar上的其實不然,你松手就會被在AppBarLayout下的toolbar覆蓋掉哲泊。這就是為什么要要這個時候把原本準(zhǔn)備好的小頭像顯示出來的原因剩蟀,如果我解釋的不太清楚,可以看看切威,我的圖片育特,我用綠色邊勾勒的是小頭像是我提前準(zhǔn)備好的那張頭像。

好了其實這些都不是我想說的重點先朦,重點是缰冤,大神寫的這個流暢的,Behavior
好了我需要在粘貼兩個重點的代碼烙无。

    private void maybeInitProperties(CircleImageView child, View dependency) {
        if (mStartYPosition == 0)
            mStartYPosition = (int) (dependency.getY());

        if (mFinalYPosition == 0)
            mFinalYPosition = (dependency.getHeight() /2);

        if (mStartHeight == 0)
            mStartHeight = child.getHeight();

        if (mStartXPosition == 0)
            mStartXPosition = (int) (child.getX() + (child.getWidth() / 2));

        if (mFinalXPosition == 0)
            mFinalXPosition =  ((int) dependency.getWidth() / 2);

        if (mStartToolbarPosition == 0)
            mStartToolbarPosition = dependency.getY();

        if (mChangeBehaviorPoint == 0) {
            mChangeBehaviorPoint = (child.getHeight() - mCustomFinalHeight) / (2f * (mStartYPosition - mFinalYPosition));
        }
    }

看這個代碼的時候我準(zhǔn)備了一張圖片锋谐,雖然有點糙,但是湊合看吧


超級麻煩的手繪圖片

這就是大概一個截酷,邏輯圖片涮拗,說明了。大概要用的幾個屬性值是什么意思迂苛,這里最重點的是這句話

  mChangeBehaviorPoint = (child.getHeight() - mCustomFinalHeight) / (2f * (mStartYPosition - mFinalYPosition));

一看就知道三热,他們要比例什么了,


圓圈圈和正方形

簡單解釋一下三幻,一個兩個圓的差值 比矩形的差值還??2 這是要做什么就漾,我看完整個代碼才懂,他是為了念搬。一個位置上做縮放動畫抑堡,讓縮放動畫更加緊湊的一個過程,??2的意思其實就是增加除數(shù)值朗徊,讓這個動畫相應(yīng)位置更加向上一點首妖。必須說,我原本以為是一個爷恳,數(shù)學(xué)表達(dá)式有缆,結(jié)果好像不是的,是一個動畫設(shè)計思路温亲。

@Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, CircleImageView child, View dependency) {
        maybeInitProperties(child, dependency);

        final int maxScrollDistance = (int) (mStartToolbarPosition);
        float expandedPercentageFactor = dependency.getY() / maxScrollDistance;

        if (expandedPercentageFactor < mChangeBehaviorPoint) {
            float heightFactor = (mChangeBehaviorPoint - expandedPercentageFactor) / mChangeBehaviorPoint;

            float distanceXToSubtract = ((mStartXPosition - mFinalXPosition)
                    * heightFactor) + (child.getHeight()/2);
            float distanceYToSubtract = ((mStartYPosition - mFinalYPosition)
                    * (1f - expandedPercentageFactor)) + (child.getHeight()/2);

            child.setX(mStartXPosition - distanceXToSubtract);
            child.setY(mStartYPosition - distanceYToSubtract);

            float heightToSubtract = ((mStartHeight - mCustomFinalHeight) * heightFactor);

            CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) child.getLayoutParams();
            lp.width = (int) (mStartHeight - heightToSubtract);
            lp.height = (int) (mStartHeight - heightToSubtract);
            child.setLayoutParams(lp);
        } else {
            float distanceYToSubtract = ((mStartYPosition - mFinalYPosition)
                    * (1f - expandedPercentageFactor)) + (mStartHeight/2);

            child.setX(mStartXPosition - child.getWidth()/2);
            child.setY(mStartYPosition - distanceYToSubtract);

            CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) child.getLayoutParams();
            lp.width = (int) (mStartHeight);
            lp.height = (int) (mStartHeight);
            child.setLayoutParams(lp);
        }
        return true;
    }

重點代碼

  if (expandedPercentageFactor < mChangeBehaviorPoint) 

一個if搞定了全世界棚壁,if后面的是小頭像縮放功能的已經(jīng)X、Y軸的移動栈虚。else是處理袖外,還原大小和位置移動的僅僅是Y軸的。

就這樣魂务,所有的工作都做完了在刺。我不知道第一次的表達(dá)逆害,是不是夠清楚,其實源碼沒有修改什么蚣驼,如果需要我可以魄幕,上傳,重點是颖杏,是原作者的思路纯陨。
我修改后的源碼
馬上準(zhǔn)備 ios的類似源碼分析,努力做到留储,ios和android一起跑著玩的節(jié)奏翼抠。希望能帶節(jié)奏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末获讳,一起剝皮案震驚了整個濱河市阴颖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丐膝,老刑警劉巖量愧,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異帅矗,居然都是意外死亡偎肃,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門浑此,熙熙樓的掌柜王于貴愁眉苦臉地迎上來累颂,“玉大人,你說我怎么就攤上這事凛俱∥闪螅” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵蒲犬,是天一觀的道長朱监。 經(jīng)常有香客問我,道長暖哨,這世上最難降的妖魔是什么赌朋? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任凰狞,我火速辦了婚禮篇裁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赡若。我一直安慰自己达布,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布逾冬。 她就那樣靜靜地躺著黍聂,像睡著了一般躺苦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上产还,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天匹厘,我揣著相機與錄音,去河邊找鬼脐区。 笑死愈诚,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的牛隅。 我是一名探鬼主播炕柔,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼媒佣!你這毒婦竟也來了匕累?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤默伍,失蹤者是張志新(化名)和其女友劉穎欢嘿,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巡验,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡际插,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了显设。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片框弛。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖捕捂,靈堂內(nèi)的尸體忽然破棺而出瑟枫,到底是詐尸還是另有隱情,我是刑警寧澤指攒,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布慷妙,位于F島的核電站,受9級特大地震影響允悦,放射性物質(zhì)發(fā)生泄漏膝擂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一隙弛、第九天 我趴在偏房一處隱蔽的房頂上張望架馋。 院中可真熱鬧,春花似錦全闷、人聲如沸叉寂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屏鳍。三九已至勘纯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钓瞭,已是汗流浹背驳遵。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留山涡,地道東北人超埋。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像佳鳖,于是被迫代替她去往敵國和親霍殴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,190評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫系吩、插件来庭、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,109評論 4 62
  • 一大早,心情好穿挨,我月弛、爺爺、奶奶科盛,我們準(zhǔn)備去何山公園帽衙。 坐307公交到佳林苑的公交站臺,邊走邊問路贞绵,終于在十點二十分...
    senny1978閱讀 240評論 0 0
  • 電影《房間》講了一對了不起的母子奔向自由的故事厉萝。17歲的女孩joy在一天放學(xué)回家的路上,被一個男人謊稱自己的狗生病...
    高中語文筆記幫閱讀 520評論 0 3