Android 微信讀書本周推薦傳送帶列表實(shí)現(xiàn)

微信讀書 本周推送的類似傳送帶View的具體實(shí)現(xiàn)

實(shí)現(xiàn)效果

image

使用

  <com.icool.carousel_lib.CarouselLayout
            android:id="@+id/carousel"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:carousel_angle="-30"
            app:carousel_spacing="20dp"
            app:carousel_speed="1" />
           

只需要通過設(shè)置Adapter就OK了

 public void setAdapter(RecyclerView.Adapter adapter1, RecyclerView.Adapter adapter2, RecyclerView.Adapter adapter3) {
        mRv1.setAdapter(adapter1);
        mRv2.setAdapter(adapter2);
        mRv3.setAdapter(adapter3);
    }

屬性說明

屬性值 說明
carousel_angle 傾斜角度 默認(rèn)-30°
carousel_spacing 列表之間的間隙影斑,通常設(shè)置為recyclerView的item間距大小一致 dp
carousel_speed 速度矫户,值越大傳送越快残邀,不小于0 默認(rèn)1
  1. 可在代碼中設(shè)置間隙 setGapSpacing
  2. 代碼中設(shè)置角度 setAngle
  3. 代碼中設(shè)置速度 setSpeed

需求分析

  • 直觀有 三條傳送帶式列表
  • 一個(gè)正向移動(dòng) 兩個(gè)反向移動(dòng)
  • 有一個(gè)傾斜角度
  • 可以循環(huán)展示

具體分析

  • 根據(jù)樣式 可以確定的是需要自定義ViewGroup來實(shí)現(xiàn)
  • 結(jié)合列表的正向反向移動(dòng) 可以確定:RecyclerView + LinearLayoutManager 可以做到
  • 不停滾動(dòng)借助 Scroller 來實(shí)現(xiàn)
  • 傾斜角度 可以通過 setRatation() 方法來旋轉(zhuǎn)一個(gè)角度
  • 循環(huán)展示 通過設(shè)置 RecyclerView.AdapteritemCountInter.MAX_VALUE

具體實(shí)現(xiàn)

自定義CarouselLayout繼承自ViewGroup

添加一個(gè)子View LinearLayout, setOrientation(LinearLayout.VERTICAL);
依次添加三個(gè) RecyclerView,設(shè)置其 marginTopgapSpacing的值

    mContainer = new LinearLayout(getContext());
        mContainer.setOrientation(LinearLayout.VERTICAL);
        addView(mContainer, generateDefaultLayoutParams());
        mRv1 = new CarouselRecyclerView(getContext());
        mRv2 = new CarouselRecyclerView(getContext());
        mRv3 = new CarouselRecyclerView(getContext());
        mContainer.addView(mRv1);
        mContainer.addView(mRv2);
        mContainer.addView(mRv3);
        setSpacing();//此方法設(shè)置margin,詳見代碼

        mRv1.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false));
        mRv2.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, true));
        mRv3.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false));
 

旋轉(zhuǎn)一個(gè)角度

設(shè)置 LinearLayout 的rotation

 mContainer.setRotation(mAngle);//旋轉(zhuǎn)角度

設(shè)置LinearLayout的大小來保證切斜后仍可以占滿全屏

由于在ViewGroup中最大的距離就是對(duì)角線驱闷,所以 設(shè)置 子View的寬高都為對(duì)角線的長(zhǎng)度

//對(duì)角線長(zhǎng)度
  mDiagonalLine = (int) Math.sqrt(getMeasuredWidth() * getMeasuredWidth() + getMeasuredHeight() * getMeasuredHeight());
        ViewGroup.LayoutParams params = mContainer.getLayoutParams();
        params.width = mDiagonalLine;
        params.height = mDiagonalLine;
        mContainer.setLayoutParams(params);
        

移動(dòng)起來

借助Scroller類來不斷 調(diào)用 computeScroll方法實(shí)現(xiàn)滾動(dòng)

   @Override
    public void computeScroll() {
        super.computeScroll();
        mRv1.scrollBy(mSpeed, 0);//speed 對(duì)應(yīng)移動(dòng)像素值
        mRv2.scrollBy(-mSpeed, 0);
        mRv3.scrollBy(mSpeed, 0);
        if (mScroller.isFinished()) {
            start();
        }
    }
    

其他

  1. 因?yàn)榱斜硎褂?code>RecyclerView實(shí)現(xiàn)空另,所以我們手動(dòng)還可以滑動(dòng)它鼓蜒。
    如果不想手動(dòng)滑動(dòng)的話征字,重寫RecyclerViewonTouchEvent方法, return false;
  2. 無限循環(huán)
    設(shè)置Adapter的時(shí)候
   @Override
    public int getItemCount() {
        return Integer.MAX_VALUE;
    }
  

然后在 onBindViewHolder 方法取item的時(shí)候 進(jìn)行取余操作

 String url = mSources[position % mSources.length];

后記

這個(gè)效果在微信閱讀上是WebView實(shí)現(xiàn)的匙姜,我們的UI直接抄了過來氮昧。所以只能用Android代碼實(shí)現(xiàn)一下。
如果有更好的實(shí)現(xiàn)方式袖肥,或者需要改進(jìn)的地方振劳,希望可以一起探討。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末寸癌,一起剝皮案震驚了整個(gè)濱河市蒸苇,隨后出現(xiàn)的幾起案子吮旅,更是在濱河造成了極大的恐慌,老刑警劉巖檬嘀,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件责嚷,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)堡纬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門烤镐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人炮叶,你說我怎么就攤上這事渡处∫教保” “怎么了旧困?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)吼具。 經(jīng)常有香客問我,道長(zhǎng)怖竭,這世上最難降的妖魔是什么陡蝇? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任毅整,我火速辦了婚禮,結(jié)果婚禮上悼嫉,老公的妹妹穿的比我還像新娘。我一直安慰自己蹋凝,他們只是感情好总棵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布情龄。 她就那樣靜靜地躺著,像睡著了一般骤视。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上睹逃,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天祷肯,我揣著相機(jī)與錄音沉填,去河邊找鬼。 笑死斑鼻,一個(gè)胖子當(dāng)著我的面吹牛橄碾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播法牲,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拒垃,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了戈毒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤埋市,失蹤者是張志新(化名)和其女友劉穎道宅,沒想到半個(gè)月后胸蛛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泞当,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年襟士,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敌蜂。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖汗贫,靈堂內(nèi)的尸體忽然破棺而出秸脱,到底是詐尸還是另有隱情部蛇,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布巷查,位于F島的核電站抹腿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏警绩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一肩祥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧岸霹,春花似錦、人聲如沸贡避。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)皇筛。三九已至坠七,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間彪置,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工惶桐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贿衍。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓救恨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親擎淤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子秸仙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,116評(píng)論 25 707
  • 用兩張圖告訴你筋栋,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 12,723評(píng)論 2 59
  • 【Android 控件 RecyclerView】 概述 RecyclerView是什么 從Android 5.0...
    Rtia閱讀 307,507評(píng)論 27 439
  • 內(nèi)容 抽屜菜單 ListView WebView SwitchButton 按鈕 點(diǎn)贊按鈕 進(jìn)度條 TabLayo...
    小狼W閱讀 1,613評(píng)論 0 10
  • 你還是孩子時(shí)啼染,覺得自己將來會(huì)當(dāng)作家焕梅。寫一本偉大的書。 后來有太多人告訴你贞言,沒戲。 據(jù)說每一個(gè)進(jìn)中文系的人该窗,都要先聽...
    炊玉客閱讀 461評(píng)論 0 2