仿京東,淘寶廣告滾動(dòng)

最近看UI再設(shè)計(jì)新的APP效果圖荷并,發(fā)現(xiàn)首頁使用了類似京東首頁京東日?qǐng)?bào)模塊類似的廣告自動(dòng)滾動(dòng)效果合砂,于是就想著提前準(zhǔn)備,寫個(gè)通用組件源织。網(wǎng)上查閱了很多的文章翩伪,絕大多數(shù)都是說使用TextSwitcher來實(shí)現(xiàn)這個(gè)效果。我也用TextSwitcher實(shí)踐了一下谈息,確實(shí)能實(shí)現(xiàn)幻工,然后也很簡單只需要給TextSwitcher設(shè)置inAnimation(進(jìn)入動(dòng)畫),outAnimation(離開動(dòng)畫),factory(在他的makeView中生成View)黎茎,然后需要一個(gè)Handler定時(shí)切換即可完成囊颅,不理解的同學(xué)可以去看一下TextSwitcher的用法。

京東快報(bào).png

但是傅瞻,無意間踢代,發(fā)現(xiàn)淘寶首頁也有這么一個(gè)功能,叫淘寶頭條嗅骄,雖然說都是廣告的上下滾動(dòng)胳挎,但是淘寶頭條的內(nèi)容還有有區(qū)別的,他包含了兩條文本廣告信息溺森,以及一張圖片慕爬。

淘寶頭條.png

此時(shí),這樣子的需求,使用TextSwitcher是無法滿足我們的需求了屏积,原因很簡單医窿,TextSwitcher中的子View是由我們?cè)O(shè)置的Factory的makeView方法創(chuàng)建的,而這個(gè)方法返回的炊林,必須是TextView對(duì)象姥卢,這一點(diǎn)再TextSwitcher的源碼中可以證實(shí).

@Override
public void addView(View child, int index, ViewGroup.LayoutParams params) {
  if (!(child instanceof TextView)) {
    throw new IllegalArgumentException(
      "TextSwitcher children must be instances of TextView");
  }
  super.addView(child, index, params);
}

其實(shí),android SDK中不僅僅提供了用于文本滾動(dòng)的TextSwitcher渣聚,同時(shí)還提供了用于圖片滾動(dòng)的ImageSwitcher独榴,但是他們都無法滿足我們的需求,因此奕枝,就尋思著是否可以有一個(gè)自定義布局的組件棺榔,來實(shí)現(xiàn)這個(gè)功能呢,這時(shí)候我查閱了一下TextSwitcher與ImageSwitcher,發(fā)現(xiàn)他們都是ViewSwitcher的子類隘道,那就通過一個(gè)集成ViewSwitcher來實(shí)現(xiàn)我們的需求吧症歇。

廢話不多說捞烟,先把效果圖拿上來(似乎已經(jīng)扯了很多廢話了。当船。题画。)

廣告滾動(dòng).gif

整個(gè)流程其實(shí)很簡單,我們只需要將一開始講述的幾點(diǎn)封裝到我們的Switcher中就可以了德频,首先我們定義一個(gè)Adapter,讓他作為數(shù)據(jù)與Switcher之間的橋梁苍息,同時(shí),這邊使用了泛型壹置,讓我們使用過程中更加靈活

public interface IAdvertAdapter<T> {

    /**
     * 獲取當(dāng)前數(shù)據(jù)個(gè)數(shù)
     * @return
     */
    public int getCount();

    /**
     * 獲取position位置對(duì)應(yīng)的數(shù)據(jù)
     * @param position
     * @return
     */
    public T getItem(int position);

    /**
     * 創(chuàng)建View
     * 這邊僅僅是創(chuàng)建View竞思,不要給View綁定數(shù)據(jù),或者添加事件監(jiān)聽之類
     * Only new View or inflate layout
     * @return
     */
    public View makeView();

    /**
     * 為View綁定數(shù)據(jù)钞护,同時(shí)添加對(duì)應(yīng)的事件監(jiān)聽
     * @param view
     * @param data
     */
    public void bindView(View view, T data);
}

然后盖喷,重點(diǎn)來了,創(chuàng)建我們的組件难咕,繼承ViewSwitcher,同時(shí)也實(shí)現(xiàn)ViewSwitcher.ViewFactory接口课梳,該類中其實(shí)也沒有太多動(dòng)心,就不貼出來了余佃,下面會(huì)給出源碼地址暮刃,比較核心的還是Handler,實(shí)現(xiàn)自動(dòng)輪播爆土,定時(shí)發(fā)送一條消息椭懊,然后調(diào)用ViewSwitcher的showNext()方法,就能實(shí)現(xiàn)自動(dòng)輪播功能了步势。

private class ScrollHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case FLAG_START_SCROLL:
                    View view = getNextView();
                    mAdapter.bindView(view, mAdapter.getItem(currentIndex));
                    Log.e(TAG, "Index:" + currentIndex + " //" + mAdapter.getItem(currentIndex).toString());
                    showNext();
                    currentIndex = ++currentIndex % mAdapter.getCount();
                    mHandler.sendEmptyMessageDelayed(FLAG_START_SCROLL, mTimeSpan);
                    break;
                case FLAG_STOP_SCROLL:
                    mHandler.removeMessages(FLAG_START_SCROLL);
                    break;
                case FLAG_REFRESH:
                    currentIndex = 0;
                    removeAllViews();
                    start();
                    break;
            }
        }
    }

使用起來也非常簡單氧猬,類似與列表的使用,分一下幾步走

1.實(shí)現(xiàn)IAdvertAdapter,關(guān)鍵實(shí)現(xiàn)makeView(),再這個(gè)方法中加載我們自定義的布局坏瘩,或者自己創(chuàng)建的View盅抚,當(dāng)然,這邊不要去做數(shù)據(jù)綁定相關(guān)的操作桑腮。

2.實(shí)現(xiàn)IAdvertAdapter中的bindView泉哈,做一下數(shù)據(jù)綁定,事件綁定相關(guān)的操作

3.switchers.setAdapter(new IAdvertAdapter(context, data));

這邊只是寫了大體的使用步驟破讨,具體還是看源碼吧,非常簡單奕纫,喜歡的加伙伴可以幫忙加一個(gè)小星星提陶,算是一點(diǎn)鼓勵(lì)吧_

https://github.com/yunzhouhua/AdvertSwitcher

疑問

1.如果廣告很多創(chuàng)建了很多的View,而最終也就顯示兩個(gè)匹层,是否浪費(fèi)性能隙笆?有優(yōu)化嘛锌蓄?

? 開始我就有這樣的疑問,以為makeView每次都會(huì)創(chuàng)建新的View添加帶ViewSwitcher中撑柔,也準(zhǔn)備做一下View復(fù)用瘸爽,但是看了ViewSwitcher的源碼后,發(fā)現(xiàn)多費(fèi)心了铅忿,google爸爸早就幫我們想到了剪决。ViewSwitcher中只會(huì)有兩個(gè)View,makeView也只會(huì)調(diào)用兩次檀训,如果有第三次的情況柑潦,程序肯定會(huì)奔潰,不信嘛峻凫?看下下面的代碼渗鬼,ViewSwitcher-addView

@Override
    public void addView(View child, int index, ViewGroup.LayoutParams params) {
        if (getChildCount() >= 2) {
            throw new IllegalStateException("Can't add more than 2 views to a ViewSwitcher");
        }
        super.addView(child, index, params);
    }

ViewSwitcher內(nèi)部再setFactory的時(shí)候連續(xù)調(diào)用了兩次obtainView創(chuàng)建出了對(duì)應(yīng)的View并添加到ViewSwitcher,而之后的滾動(dòng)效果完全就是這兩個(gè)view通過動(dòng)畫荧琼,控制顯示/隱藏實(shí)現(xiàn)的譬胎。感興趣的可以看一下源碼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末命锄,一起剝皮案震驚了整個(gè)濱河市银择,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌累舷,老刑警劉巖浩考,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異被盈,居然都是意外死亡析孽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門只怎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來袜瞬,“玉大人,你說我怎么就攤上這事身堡〉擞龋” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵贴谎,是天一觀的道長汞扎。 經(jīng)常有香客問我,道長擅这,這世上最難降的妖魔是什么澈魄? 我笑而不...
    開封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮仲翎,結(jié)果婚禮上痹扇,老公的妹妹穿的比我還像新娘铛漓。我一直安慰自己,他們只是感情好鲫构,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開白布浓恶。 她就那樣靜靜地躺著,像睡著了一般结笨。 火紅的嫁衣襯著肌膚如雪包晰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天禀梳,我揣著相機(jī)與錄音杜窄,去河邊找鬼。 笑死算途,一個(gè)胖子當(dāng)著我的面吹牛塞耕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嘴瓤,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼扫外,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了廓脆?” 一聲冷哼從身側(cè)響起筛谚,我...
    開封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎停忿,沒想到半個(gè)月后驾讲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡席赂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年吮铭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颅停。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谓晌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出癞揉,到底是詐尸還是另有隱情纸肉,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布喊熟,位于F島的核電站柏肪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏逊移。R本人自食惡果不足惜预吆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胳泉。 院中可真熱鬧拐叉,春花似錦、人聲如沸扇商。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽案铺。三九已至蔬芥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間控汉,已是汗流浹背笔诵。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留姑子,地道東北人乎婿。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像街佑,于是被迫代替她去往敵國和親谢翎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,085評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫沐旨、插件森逮、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,096評(píng)論 4 62
  • 把你的詩編成我的歌, 唱給你聽磁携, 躺在你的文字里褒侧, 如若躺在崇山一席綠地上, 聽蜜蜂與蝴蝶的輕吟谊迄, 看暮色與炊煙的...
    孝蒽閱讀 318評(píng)論 0 1
  • 啟幕杯男籃邀請(qǐng)賽闷供,豐瑞男籃的型男們打出了第二名的好成績。通過比賽鳞上,增強(qiáng)了團(tuán)隊(duì)凝聚力这吻,也驚喜地發(fā)現(xiàn)豐瑞所存在很多外冷...
    d155b3e6ac2c閱讀 416評(píng)論 0 0
  • 1.每餐八分飽 營養(yǎng)得到補(bǔ)充,并且精神充沛篙议;少兩分唾糯,沒有精力做事,多兩分過飽鬼贱,人變得懶散移怯。
    太陽花_崔文杰閱讀 469評(píng)論 1 8