Tablayout-自定义TAB

高糊演示

Tablayout自定义TAB实现

需求:选中放大,放大的字体和小字要在同一高度上.


tab

一.布局准备

1.在需要的地方加入design包下的tablayout

    <android.support.design.widget.TabLayout
                android:id="@+id/tablayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginRight="10dp"
                android:layout_weight="1"
                app:tabPaddingBottom="-1dp"
                app:tabPaddingEnd="-1dp"
                app:tabPaddingStart="-1dp"
                app:tabPaddingTop="-1dp" />

2.小Tab的布局,依照你的需求随便自定义

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_tab_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="标签名"
        android:textColor="@drawable/tab_color"
        android:textSize="15sp" />

    <TextView
        android:id="@+id/tv_tab_number"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="0"
        android:visibility="gone"
        android:textColor="@drawable/tab_color"
        android:textSize="14sp" />
</LinearLayout>

一.代码设置

1.写了一个setTablayout的方法:

 private void setTablayout() {
        holder = null;
        for (int i = 0; i < mTabs.size(); i++) {
            //依次获取标签
            if (tablayout != null) {
                TabLayout.Tab tab = tablayout.getTabAt(i);
                //为每个标签设置布局
                tab.setCustomView(R.layout.tab_item);
                holder = new ViewHolder(tab.getCustomView());
                //为标签填充数据
                holder.tvTabName.setText(mTabs.get(i).getName());
                holder.tvTabNumber.setText(String.valueOf(mTabs.get(i).getId()));
                //默认选择第一项
                if (i == 0) {
                    holder.tvTabName.setSelected(true);
                    holder.tvTabNumber.setSelected(true);
                    TextPaint tp = holder.tvTabName.getPaint();
                    tp.setFakeBoldText(true);
                    holder.tvTabName.setTextSize(18);
                    holder.tvTabNumber.setTextSize(18);
                    ViewCompat.animate(holder.tvTabName)
                            .translationY(2)
                            .start();
                }
            }

        }

        //tab选中的监听事件
        tablayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                if (tab != null) {
                    holder = new ViewHolder(tab.getCustomView());
                    if (holder.tvTabName != null) {
                        TextPaint tp = holder.tvTabName.getPaint();
                        tp.setFakeBoldText(true);
                        holder.tvTabName.setSelected(true);
                        holder.tvTabNumber.setSelected(true);
                        //选中后字体变大
                        holder.tvTabName.setTextSize(18);
                        holder.tvTabNumber.setTextSize(18);
                        //选中后字体向下移
                        ViewCompat.animate(holder.tvTabName)
                                .translationY(2)
                                .start();
                        //让Viewpager跟随TabLayout的标签切换
                        viewPager.setCurrentItem(tab.getPosition());
                    }
                }

            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                if (tab != null) {
                    if (holder.tvTabName != null) {
                        holder = new ViewHolder(tab.getCustomView());
                        holder.tvTabName.setSelected(false);
                        holder.tvTabNumber.setSelected(false);
                        TextPaint tp = holder.tvTabName.getPaint();
                        tp.setFakeBoldText(false);
                        //恢复为默认字体大小
                        holder.tvTabName.setTextSize(15);
                        holder.tvTabNumber.setTextSize(15);
                        //选中后字体向下移
                        ViewCompat.animate(holder.tvTabName)
                                .translationY(0)
                                .start();

                    }
                }


            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });
        reflex(tablayout);
    }

2.如果觉得tab的间距太宽这里提供一个修改tab宽度的方法reflex,原本这个方法我是用来修改tab下面的下划线宽度用的,这里也可以拿来用.

    public void reflex(final TabLayout tabLayout) {
        //了解源码得知 线的宽度是根据 tabView的宽度来设置的
        tabLayout.post(new Runnable() {
            @Override
            public void run() {
                try {
                    //拿到tabLayout的mTabStrip属性

                    LinearLayout mTabStrip = (LinearLayout) tabLayout.getChildAt(0);

                    int dp10 = dip2px(tabLayout.getContext(), 10);

                    for (int i = 0; i < mTabStrip.getChildCount(); i++) {
                        View tabView = mTabStrip.getChildAt(i);

                        //拿到tabView的mTextView属性  tab的字数不固定一定用反射取mTextView
                        Field mTextViewField = tabView.getClass().getDeclaredField("mTextView");
                        mTextViewField.setAccessible(true);

                        TextView mTextView = (TextView) mTextViewField.get(tabView);

                        tabView.setPadding(-1, -1, -1, -1);

                        //因为我想要的效果是   字多宽线就多宽,所以测量mTextView的宽度
                        int width = 0;
                        width = mTextView.getWidth();
                        if (width == 0) {
                            mTextView.measure(0, 0);
                            width = mTextView.getMeasuredWidth();
                        }

                        //设置tab左右间距为10dp  注意这里不能使用Padding 因为源码中线的宽度是根据 tabView的宽度来设置的
                        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) tabView.getLayoutParams();
                        params.width = (int) (width * 1.5);
                        params.leftMargin = dp10;
                        params.rightMargin = dp10;
                        tabView.setLayoutParams(params);
                        tabView.invalidate();
                    }

                } catch (NoSuchFieldException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        });

    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容