實(shí)現(xiàn)簡(jiǎn)書App搜索框伸縮效果

前言

看到簡(jiǎn)書App搜索頁(yè)面的效果锣笨,感覺不錯(cuò)箭启。主要實(shí)現(xiàn)還是靠安卓提供的ObjectAnimator和系統(tǒng)為我們提供的Transition框架。效果如下

GIF.gif

1.使用ObjectAnimator實(shí)現(xiàn)

 private void setAnimator(ObjectAnimator objectAnimator, final int status) {
        objectAnimator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {

            }

            @Override
            public void onAnimationEnd(Animator animation) {
                if (status == 0) {
                    getBinding().tvTitle.setText("搜索");
                } else if (status == 1) {
                    getBinding().tvTitle.setText("搜索簡(jiǎn)書的內(nèi)容和朋友");
                }
            }

            @Override
            public void onAnimationCancel(Animator animation) {

            }

            @Override
            public void onAnimationRepeat(Animator animation) {

            }
        });
        objectAnimator.setDuration(100);
        objectAnimator.start();
    }

這個(gè)方法主要是執(zhí)行動(dòng)畫之后監(jiān)聽改變文字狀態(tài),這里需要注意的是ObjectAnimator本身沒有給我們提供改

變View的寬高屬性變化的屬性

以下是屬性動(dòng)畫常用屬性值:

translationX和translationY:作為一種增量來(lái)控制View對(duì)象從他容器的左上角坐標(biāo)偏移的位置

rotation rotationX和rotationY:控制View圍繞支點(diǎn)進(jìn)行2D和3D的旋轉(zhuǎn)

scaleX和scaleY:控制View圍繞他的支點(diǎn)進(jìn)行2D旋轉(zhuǎn)

pivotX和pivotY:控制View對(duì)象的支點(diǎn)位置慨畸,圍繞這個(gè)支點(diǎn)進(jìn)行旋轉(zhuǎn)和縮放的處理倒谷,默認(rèn)情況下支點(diǎn)位置為對(duì)象的中心點(diǎn)

如果一個(gè)屬性沒有g(shù)et和set方法可以通過包裹類來(lái)實(shí)現(xiàn)蛛蒙。

public class ViewWrapper {
    private View view;

    public ViewWrapper(View view) {
        this.view = view;
    }

    //寬度Setter方法
    public void setWidth(int width) {
        ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
        layoutParams.width = width;
        view.setLayoutParams(layoutParams);
        view.invalidate();
    }

    public int getWidth() {
        return view.getLayoutParams().width;
    }
}

這里是實(shí)現(xiàn)改變寬度的方法,應(yīng)用在scrollview監(jiān)聽里面如下

 getBinding().scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
            @Override
            public void onScrollChanged() {
                //改變toolbar的透明度
                changeToolbarAlpha();
                if (getBinding().scrollView.getScrollY() >= getBinding().img.getHeight() - getBinding().layoutToolbar.getHeight() && !isExpand) {
//                    exPand();//靠系統(tǒng)提供的Transition實(shí)現(xiàn)view寬度改變
                    isExpand = true;
                    ObjectAnimator objectAnimator = ObjectAnimator.ofInt(new ViewWrapper(getBinding().layoutTitle), "width", ScreenWidth);//這是靠動(dòng)畫來(lái)改變view寬度
                    setAnimator(objectAnimator, 1);
                } else if (getBinding().scrollView.getScrollY() <= 0 && isExpand) {
//                    reDuce();
                    isExpand = false;
                    ObjectAnimator objectAnimator = ObjectAnimator.ofInt(new ViewWrapper(getBinding().layoutTitle), "width", dip2px(70));
                    setAnimator(objectAnimator, 0);
                }
            }
        });

ScreenWidth是屏幕的寬度渤愁,dip2px(70)是固定寬度牵祟,這些可以自己按需求定制。這里引入一個(gè)isExpand是為了防止動(dòng)畫重復(fù)執(zhí)行抖格,這點(diǎn)在做其他動(dòng)畫效果同樣適用诺苹,需要注意咕晋。此方法是借鑒本篇文章而來(lái)http://www.reibang.com/p/4419f6448d88,這里沒有指明自定義set方法實(shí)現(xiàn)改變view寬度收奔,所以做個(gè)補(bǔ)充掌呜。

2.利用系統(tǒng)為我們提供的Transition框架

 private void exPand() {
        getBinding().tvTitle.setText("搜索簡(jiǎn)書的內(nèi)容和朋友");
        RelativeLayout.LayoutParams LayoutParams = (RelativeLayout.LayoutParams)       getBinding().layoutTitle.getLayoutParams();
        LayoutParams.width = RelativeLayout.LayoutParams.MATCH_PARENT;
        LayoutParams.setMargins(dip2px(10), dip2px(10), dip2px(10), dip2px(10));
        getBinding().layoutTitle.setLayoutParams(LayoutParams);
        //開始動(dòng)畫
        beginDelayedTransition(getBinding().layoutTitle);
    }
private void beginDelayedTransition(ViewGroup view) {
        transitionSet = new AutoTransition();
        transitionSet.setDuration(200);
        TransitionManager.beginDelayedTransition(view, transitionSet);
    }

利用系統(tǒng)提供的AutoTransition創(chuàng)建一個(gè)缺省轉(zhuǎn)換,淡入/淡出,在一個(gè)場(chǎng)景中移動(dòng)和調(diào)整大小,當(dāng)view改變時(shí)坪哄。
第二種方法需要引入design包兼容

compile 'com.android.support:design:27.0.2'

關(guān)于toolbar的漸變可以看文末的源碼實(shí)現(xiàn)质蕉,需要注意的是一定要給toolbar設(shè)置一個(gè)初始背景色,不然會(huì)包沒有背景引用空指針異常翩肌。

注意

需要給文字設(shè)置單行顯示模暗,不然會(huì)有一個(gè)閃動(dòng),利用Transition時(shí)候需要給文字設(shè)置寬高自適應(yīng)摧阅,這里我也不太明白為什么設(shè)置高度全充滿會(huì)閃爍一下汰蓉。
最后附上源碼
https://github.com/NullRoutine/databindinglibrary
直接查看AnimatorActivity即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末棒卷,一起剝皮案震驚了整個(gè)濱河市顾孽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌比规,老刑警劉巖若厚,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蜒什,居然都是意外死亡测秸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門灾常,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)霎冯,“玉大人,你說(shuō)我怎么就攤上這事钞瀑∩蜃玻” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵雕什,是天一觀的道長(zhǎng)缠俺。 經(jīng)常有香客問我,道長(zhǎng)贷岸,這世上最難降的妖魔是什么壹士? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮偿警,結(jié)果婚禮上躏救,老公的妹妹穿的比我還像新娘。我一直安慰自己螟蒸,他們只是感情好盒使,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布睁本。 她就那樣靜靜地躺著,像睡著了一般忠怖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抄瑟,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天凡泣,我揣著相機(jī)與錄音,去河邊找鬼皮假。 笑死鞋拟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的惹资。 我是一名探鬼主播贺纲,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼褪测!你這毒婦竟也來(lái)了猴誊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤侮措,失蹤者是張志新(化名)和其女友劉穎懈叹,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體分扎,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡澄成,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了畏吓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片墨状。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖菲饼,靈堂內(nèi)的尸體忽然破棺而出肾砂,到底是詐尸還是另有隱情,我是刑警寧澤巴粪,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布通今,位于F島的核電站,受9級(jí)特大地震影響肛根,放射性物質(zhì)發(fā)生泄漏辫塌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一派哲、第九天 我趴在偏房一處隱蔽的房頂上張望臼氨。 院中可真熱鬧,春花似錦芭届、人聲如沸储矩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)持隧。三九已至即硼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屡拨,已是汗流浹背只酥。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呀狼,地道東北人裂允。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像哥艇,于是被迫代替她去往敵國(guó)和親绝编。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,306評(píng)論 25 707
  • 動(dòng)畫基礎(chǔ)概念 動(dòng)畫分類 Android 中動(dòng)畫分為兩種貌踏,一種是 Tween 動(dòng)畫十饥、還有一種是 Frame 動(dòng)畫。 ...
    Rtia閱讀 1,236評(píng)論 0 6
  • 【Android 動(dòng)畫】 動(dòng)畫分類補(bǔ)間動(dòng)畫(Tween動(dòng)畫)幀動(dòng)畫(Frame 動(dòng)畫)屬性動(dòng)畫(Property ...
    Rtia閱讀 6,182評(píng)論 1 38
  • 基本情況# 姓名:王牛牛 年齡:8歲 小組:第2組 #90天目標(biāo)及完成情況# 1哩俭、家長(zhǎng)目標(biāo):完成情況: 第一個(gè)30...
    白璠閱讀 428評(píng)論 0 0
  • ㄑㄧㄢˊ绷跑,錢。例句:給我錢阿渾蛋凡资!其實(shí)這個(gè)字原本是要寫在 1/2 的砸捏,但翻錯(cuò)頁(yè)了,我粗心我廢我沒有用隙赁。
    艾普羅小姐閱讀 181評(píng)論 0 0