仿騰訊視頻Doki頁(yè)

仿騰訊視頻Doki頁(yè)

1.效果

1.騰訊視頻效果


2017-10-08-16-28-27.gif

2.實(shí)現(xiàn)的效果

2017-10-08-16-50-49.gif

使用

   dokiView.setAdapter(new DokiView.DokiAdapter(list) {
            @Override
            public void bindview(int position, T t, DokiView.ViewBean viewBean) {
                viewBean.tv.setText();
                viewBean.iv.setImageDrawable(getRounddrawable(R.drawable.a5)
            }
        })
        .setonDokiClickListener(new DokiView.onDokiClickListener() {
            @Override
            public void singleClick(int position, View view) {
                Toast.makeText(view.getContext(), "singleClick", 0).show();
            }

            @Override
            public void doubleClick(int position, View view) {
                Toast.makeText(view.getContext(), "doubleClick", 0).show();
            }
        })
        .setupWithViewPager(vp);

2.實(shí)現(xiàn)

先打開(kāi)騰訊視頻,用studio device monitor查看是一個(gè)水平scrollView
內(nèi)面是TabWidget叁幢,我這邊就用Linealayout了

aa.jpg.png
  1. 自定義View繼承horizontalScrollView

  2. 添加一個(gè)水平的LinearLayout用于添加各個(gè)View

contentView = new LinearLayout(getContext());
addView(contentView, getContentLayoutParams());
  1. 改版Baseadapter用于生產(chǎn)view
 public static abstract class DokiAdapter<T> extends BaseAdapter {
        public ViewBean getView(int orentation, int i, ViewGroup viewGroup) {
            ViewBean viewBean = sparseArray.get(i);
            if (viewBean == null) {
                viewBean = new ViewBean(orentation, viewGroup);
                sparseArray.put(i, viewBean);
            }
            bindview(i, list.get(i), viewBean);
            return viewBean;
        }
        public abstract void bindview(int position, T item, ViewBean viewBean);
    }
  1. view 單個(gè)子包裝到ViewBean
static class ViewBean {
        ImageView iv;
        TextView tv;
        LinearLayout itemview;

        public ViewBean(int orentation, ViewGroup viewGroup) {
            itemview = new LinearLayout(viewGroup.getContext());
            itemview.setClipChildren(true);
            itemview.setOrientation(orentation);
            itemview.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);

            iv = new ImageView(viewGroup.getContext());

            tv = new TextView(viewGroup.getContext());
            tv.setTextColor(0xffffffff);
            tv.setPadding(2 * margin, 0, 2 * margin, 0);
            tv.getPaint().setFakeBoldText(true);
            tv.setSingleLine();

            itemview.addView(iv);
            itemview.addView(tv);
        }
    }
  1. 添加view到LinearLayout
 private void Layout() {
        if (adapter == null || adapter.getCount() == 0) {
            return;
        }
        contentView.removeAllViews();
        contentView.setOrientation(orentation);
        for (int i = 0; i < adapter.getCount(); i++) {
            ViewBean viewBean = getView(i);
            if (listener != null) {
                final int position = i;
                viewBean.itemview.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        if (checked != position) {
                            /**
                             * viewPager不為null調(diào)viewpager
                             * 否則調(diào)動(dòng)畫(huà)
                             */
                            if (viewPager != null) {
                                viewPager.setCurrentItem(position, false);
                            } else {
                                doAnimator(checked, position);
                                checked = position;
                            }
                            listener.singleClick(position, v);
                        } else {
                            if (System.currentTimeMillis() - lastclicktime < 600) {
                                listener.doubleClick(position, v);
                                lastclicktime = 0;
                            } else {
                                lastclicktime = System.currentTimeMillis();
                            }
                        }
                    }
                });
            }
            ViewGroup.LayoutParams layoutParams = getView(i).itemview.getLayoutParams();
            Log.i("qqq", "Layout: " + (layoutParams == null));
            if (layoutParams == null) {
                /**
                 * 未選中的隱藏文字
                 */
                LinearLayout.LayoutParams contentLayoutParams = getContentLayoutParams();
                contentLayoutParams.leftMargin = margin;
                contentLayoutParams.rightMargin = margin;
                contentLayoutParams.topMargin = margin;
                contentLayoutParams.bottomMargin = margin;
                if (checked != i)
                    contentLayoutParams.width = ivWidth + 2 * margin;
                contentView.addView(viewBean.itemview, contentLayoutParams);
            } else {
                contentView.addView(viewBean.itemview, layoutParams);
            }
        }
    }

  1. 過(guò)度動(dòng)畫(huà)
    顯示名字的view漸隱,選中的漸現(xiàn)搞动,若在邊緣位置判斷讓左右的view平移到屏幕中
 private void doAnimator(final int lastChecked, final int position) {
        final ViewBean lastbean = getView(lastChecked);
        final ViewBean checkbean = getView(position);
        if (set != null)
            set.end();
        set = new AnimatorSet();
        
        final float checkX = checkbean.itemview.getX();
        checkbean.itemview.measure(0, 0);
        final int measuredWidth = lastbean.itemview.getMeasuredWidth();
        final int measuredWidth2 = checkbean.itemview.getMeasuredWidth();
        ObjectAnimator animator = ObjectAnimator.ofInt(lastbean, "width", measuredWidth, ivWidth).setDuration(200);
        ObjectAnimator animator2 = ObjectAnimator.ofInt(checkbean, "width", ivWidth, measuredWidth2).setDuration(200);
        set.playTogether(animator, animator2);
        set.start();

        if (position > lastChecked) {
            /**
             * 右邊點(diǎn)擊時(shí)若還有item在屏幕外左移view
             */
            float expect = checkX + measuredWidth2 - measuredWidth + 2 * ivWidth + 4 * margin - getScrollX();
            if (expect > getWidth() - getPaddingLeft() - getPaddingRight()) {
                smoothScrollBy((int) (expect - getWidth()), 0);
            }
        } else {
        /**
             * 左邊點(diǎn)擊時(shí)若還有item在屏幕外右移view
             */
            Log.i("11", "doAnimator: " + (checkX - getScrollX() - ivWidth - 4 * margin));
            if (checkX - getScrollX() < ivWidth + 4 * margin) {
                smoothScrollBy((int) (checkX - getScrollX() - ivWidth - 4 * margin), 0);
            }

        }

    }

github地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末参萄,一起剝皮案震驚了整個(gè)濱河市综苔,隨后出現(xiàn)的幾起案子府怯,更是在濱河造成了極大的恐慌刻诊,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牺丙,死亡現(xiàn)場(chǎng)離奇詭異则涯,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)冲簿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)粟判,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人峦剔,你說(shuō)我怎么就攤上這事浮入。” “怎么了羊异?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)彤断。 經(jīng)常有香客問(wèn)我野舶,道長(zhǎng),這世上最難降的妖魔是什么宰衙? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任平道,我火速辦了婚禮,結(jié)果婚禮上供炼,老公的妹妹穿的比我還像新娘一屋。我一直安慰自己窘疮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布冀墨。 她就那樣靜靜地躺著闸衫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪诽嘉。 梳的紋絲不亂的頭發(fā)上蔚出,一...
    開(kāi)封第一講書(shū)人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音虫腋,去河邊找鬼骄酗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛悦冀,可吹牛的內(nèi)容都是我干的趋翻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼盒蟆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼踏烙!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起茁影,我...
    開(kāi)封第一講書(shū)人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤宙帝,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后募闲,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體步脓,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年浩螺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了靴患。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡要出,死狀恐怖鸳君,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情患蹂,我是刑警寧澤或颊,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站传于,受9級(jí)特大地震影響囱挑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沼溜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一平挑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦通熄、人聲如沸唆涝。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)廊酣。三九已至,卻和暖如春助泽,著一層夾襖步出監(jiān)牢的瞬間啰扛,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工嗡贺, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留隐解,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓诫睬,卻偏偏與公主長(zhǎng)得像煞茫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子摄凡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,283評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)续徽、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,119評(píng)論 4 61
  • 今天不高興亲澡,等下要去看衣服了钦扭。
    么氼閱讀 179評(píng)論 0 0
  • 耀眼的事物總是會(huì)被他人和自己所一起灼傷。
    茶涼雨簪閱讀 280評(píng)論 0 0
  • 每一個(gè)行走在 你們自以為是的界外的腳印 都會(huì)在時(shí)光的河流里 綻放出最輝煌的光芒
    鶴洺閱讀 161評(píng)論 0 5