一、需求

页面顶部添加Tab条,类似微博首页的关注和热门两个Tab,如下图:

Screenshot_2017-11-02-21-47-09-751_com.sina.weibo.png

二、方案

三个实现要点:

TabLayout+FrameLayout

两个Tab对应两个Fragment,根据TabLayout.OnTabSelectedListener的回调切换Fragment

不使用ViewPager

三、问题

两个下划线样式问题:

不支持自定义宽度

不支持导圆角

四、解决

有两种方案,最终采用了第二种:

使用开源库

MagicIndicator

FlycoTabLayout

NavigationTabStrip

上面三个开源库均支持多种形式的Tab条,其中MagicIndicator支持在非ViewPager场景使用,另两个库目前不支持。

自定义下划线

思路:给TabLayout的mTabStrip设置背景实现自定义下划线

优点:可以绘制任意样式的下划线,线条、三角等,只要你想得到

Step1:创建背景Drawable,在onDraw方法中完成自定义的下划线绘制:

public class IndicatorDrawable extends Drawable {

private static final int INDICATOR_MARGIN = ScreenUtils.dp2px(24);

private static final int INDICATOR_HEIGHT = ScreenUtils.dp2px(3);

private static final int INDICATOR_RADIUS = ScreenUtils.dp2px(1.5f);

private View view;

private Paint paint;

public IndicatorDrawable(View view) {

this.view = view;

this.paint = new Paint();

paint.setColor(view.getContext().getResources().getColor(R.color.main_color));

}

@Override

public void draw(@NonNull Canvas canvas) {

int mIndicatorLeft = getIntValue("mIndicatorLeft");

int mIndicatorRight = getIntValue("mIndicatorRight");

int radius = INDICATOR_RADIUS;

if (mIndicatorLeft >= 0 && mIndicatorRight > mIndicatorLeft) {

canvas.drawRoundRect(new RectF(mIndicatorLeft + INDICATOR_MARGIN, view.getHeight() - INDICATOR_HEIGHT, mIndicatorRight - INDICATOR_MARGIN, view.getHeight()), radius, radius, paint);

}

}

private int getIntValue(String name) {

try {

Field f = view.getClass().getDeclaredField(name);

f.setAccessible(true);

Object obj = f.get(view);

return (Integer) obj;

} catch (Exception e) {

e.printStackTrace();

}

return 0;

}

@Override

public void setAlpha(@IntRange(from = 0, to = 255) int alpha) {

}

@Override

public void setColorFilter(@Nullable ColorFilter colorFilter) {

}

@Override

public int getOpacity() {

return PixelFormat.UNKNOWN;

}

}

Step2:xml中隐藏掉TabLayout原有的下划线:

android:id="@+id/tab_layout"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_centerHorizontal="true"

android:layout_gravity="center_horizontal"

android:gravity="center"

android:visibility="gone"

app:tabBackground="@null"

app:tabGravity="center"

app:tabIndicatorColor="@color/main_color"

app:tabIndicatorHeight="0dp"//隐藏原下划线

app:tabMode="fixed"

app:tabPaddingEnd="24dp"

app:tabPaddingStart="24dp"

app:tabTextAppearance="@style/TabTextStyle"//自定义Tab文本样式

app:tabTextColor="@color/light_text_color" />

Step3:代码里使用自定义下划线,即给mStripView设置背景:

private void initTabLayout(FeedHotVideoConfig config) {

tabLayout.removeAllTabs();

tabLayout.clearOnTabSelectedListeners();

View view = LayoutInflater.from(getContext()).inflate(R.layout.feed_tab, null);

tvFollow = (TextView) view.findViewById(R.id.tv_tab);

noticeFollow = view.findViewById(R.id.view_notice);

tabLayout.addTab(tabLayout.newTab().setCustomView(view).setTag(TAG_FOLLOW));//自定义Tab样式

tabLayout.addTab(tabLayout.newTab().setText(config.info.name).setTag(TAG_VIDEO));

tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {

@Override

public void onTabSelected(TabLayout.Tab tab) {

//Tab点击处理

int tag = (int) tab.getTag();

if (listener != null) {

listener.onTabSelected(tag);

}

refreshTab(tag);

}

@Override

public void onTabUnselected(TabLayout.Tab tab) {

}

@Override

public void onTabReselected(TabLayout.Tab tab) {

}

});

View tabStripView = tabLayout.getChildAt(0);

tabStripView.setBackground(new IndicatorDrawable(tabStripView));//设置背景 添加自定义下划线

tabLayout.setVisibility(VISIBLE);

}

五、遇到的问题

java.lang.NoSuchFieldException: mIndicatorLeft | mIndicatorRight

问题:通过反射获取SlidingTabStrip的两个私有变量值,debug包正常运行,release包报错找不到变量。

解决办法:在混淆文档中去掉对widget包的混淆,即加上

-keep class android.support.design.widget.** { *; }

android自定义键盘 下划线,TabLayout 自定义下划线相关推荐

  1. Android自定义键盘详解、自定义输入法简介

    概述 Android中有两个系统类是用来实现键盘的,分别是Keyboard和KeyboardView. Keyboard有个内部类Key,用于记录每个键的信息,如code.width.height等. ...

  2. Android的自定义键盘颜色,如何在自定义键盘Android中动态更改键的背景颜色或主题...

    我正在使用自定义键盘应用程序我需要设置或更改键盘的背景主题或颜色.在我的应用程序中,我们可以选择不同的背景主题和不同颜色的键行. 在第一次启动应用程序时它工作正常,但下次自定义键盘显示主题时不会更改. ...

  3. android 中自定义键盘,【图片】自定义属于自己的专属键盘的思路!!!(需要有android编程基础)【exagear吧】_百度贴吧...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 最近玩一些全键盘游戏,比如elona,nethack等等这类游戏,模拟器的键盘就很不够用,那个 游戏键盘 软件用起来体验也很不好,今天自己就琢磨着为这些游 ...

  4. android自定义tab下划线变大,Android开发之设置TabLayout下方下划线的宽度

    由于最近项目需要,需要设置tabLayout下方下划线的长度.笔者上网找了半天,也没有找到方法.后来了解到在源码中对tabLayout的下划线进行了设置.并没有方法可以直接设置. 然后,笔者看到了某位 ...

  5. 一个工具类实现自定义Tablayout的下划线宽度

    ** 只改变Tablayout的下划线的宽度,只需要一个工具类就可以可满足** 1.写个工具类 封装: /*** @author FX* @date 2018/07/19 11:11* @fuctio ...

  6. Android 验证码和密码输入框,能自定义输入框个数和样式(连体,下划线和方形框) 类似微信支付宝的密码输入框等

    MNPasswordEditText 项目地址:maning0303/MNPasswordEditText  简介: Android 验证码和密码输入框,能自定义输入框个数和样式(连体,下划线和方形框 ...

  7. 自定义TabLayout的下划线的长度

    tablayout自定义导航线的长度的问题,我见网上有两个解决方案,我用到我的项目中都没效果,自己总结了一个方案: 一:如果你的项目中没有滑动的动画需求你可以自定义tablayout'的item,自然 ...

  8. php css下划线,如何自定义下划线的样式

    下划线可以通过设置border-bottom以及background-image的值来自定义下划线的样式 下划线一般在文本中是一条黑色的直线,那么如何改变下划线的样式呢?接下来在文章中将为大家详细介绍 ...

  9. Android自定义控制(五)仿新浪微博的下拉刷新

    网上有很多很有名的开源框架,这里就来拉拉PullToRefresh这个框架,也就是我们平时用的下拉刷新啦,当然你问我这个有什么用啊?别人已经写好了,这里主要是学习以及练习,练习的次数多了,一切就顺其自 ...

  10. Android RecyclerView(八)设置自定义 下拉刷新 与 上拉加载数据

    Android RecyclerView(八)设置下拉刷新 与 上拉加载数据 GitHub 项目源码 CSDN 博客说明 智慧安卓App 文章分析 下拉刷新效果 上拉加载数据效果 1 xml布局文件中 ...

最新文章

  1. android.graphics.Paint方法setXfermode (Xfermode x...
  2. vue常见知识点整理
  3. idea设置打开文件窗口个数
  4. appengine_在Google的AppEngine上升级到Java 7
  5. 检测正常和不正常图_医生提醒:激素正常不等于内分泌正常,带你走出内分泌失调误区...
  6. 音视频开发(9)--视频编解码的理论和实践
  7. Python+matplotlib调用LaTex引擎渲染公式
  8. 吃瓜笔记 | Momenta王晋玮:让深度学习更高效运行的两个视角
  9. Toolbar的困惑
  10. JSP中—request.getRequestDispatcher(“login_success.jsp“).forward(request,response)
  11. python怎么查询帮助信息_Python 查看模块的帮助文档,方法和帮助信息
  12. 微软采纳我的建议在WES7增加媒体中心组件
  13. SQL列转行/行转列
  14. 小波神经网络的基本原理,小波神经网络什么意思
  15. 蒙牛、小米、比亚迪,明星企业为何扎堆换LOGO?
  16. 【笔记】【一文解决】linux - grep、sed、awk 『三剑客』
  17. Leetcode PHP题解D1:宝石与石头
  18. 项目初始化及文件配置-黑马头条PC
  19. 09-01 面向对象编程
  20. 微信新BUG曝光:好友偷偷删了你,用这样一串代码就能查出来!

热门文章

  1. 从Altium官方网站下载库文件
  2. Linux VGA驱动移植实验
  3. 【故障分析】基于主成分分析实现三容水箱故障诊断附matlab代码
  4. 9:JDBC-Java API 实战
  5. 【11】Kotlin项目实操之高阶函数二
  6. 如何用python爬取豆瓣图书 Top 250
  7. python第二版课后答案第七章7.5_IDA7.5 启动基础配置
  8. 洛谷每日三题之第四天
  9. android模拟器连接不到本地服务器
  10. android studio连接本地SqlServer数据库报网络错误