一个新闻导航栏,可以自定义文字颜色、选中文字和未选中文字大小、文字间距、拖拽效果等效果。


一、先上效果图(A、B)

二、GitHub

代码地址,欢迎指正 https://github.com/MNXP/FlexTitle

三、A的使用

1)A的引用

   <com.xp.different.ViewPagerTitleandroid:id="@+id/pager_title"flexTitle:background_content_color="@android:color/white"flexTitle:line_start_color="@android:color/holo_red_dark"flexTitle:line_end_color="@android:color/holo_blue_light"flexTitle:line_height="5dp"flexTitle:line_bottom_margins="10dp"flexTitle:item_top_margins="10dp"flexTitle:item_bottom_margins="8dp"flexTitle:item_margins="40dp"flexTitle:selected_text_Size="16sp"flexTitle:default_text_size="14sp"flexTitle:selected_text_color="@android:color/holo_orange_dark"flexTitle:title_center="false"flexTitle:line_drag="true"flexTitle:line_margins="5dp"android:layout_width="match_parent"android:layout_height="wrap_content"/>
复制代码

2)A的自定义

   <declare-styleable name="FlexTitle"><attr name="default_text_size" format="dimension" />    <attr name="selected_text_Size" format="dimension" />//选中文字大小<attr name="default_text_color" format="color" />//未选择文字颜色<attr name="selected_text_color" format="color" />//选择文字颜色<attr name="background_content_color" format="color" />//背景颜色<attr name="line_start_color" format="color" />//线 起始颜色<attr name="line_end_color" format="color" />//线 终止颜色<attr name="line_margins" format="dimension" />//线的间距<attr name="item_margins" format="dimension" />//item间距<attr name="item_top_margins" format="dimension" />//据上高度<attr name="item_bottom_margins" format="dimension" />//距下高度<attr name="line_bottom_margins" format="dimension" />//线 距下高度<attr name="line_height" format="dimension" />// 线的高度<attr name="title_center" format="boolean" />//文字是否左右均留空隙<attr name="line_drag" format="boolean" />//线是否有拖拽效果</declare-styleable>
复制代码

3)A的实现

根据titleCenter和lineDrag来判断线的起始点和终点绘制
if (titleCenter) {if (lineDrag) {if (lastPosition > position) {for (int i = 0; i < position; i++) {leftAll = leftAll + getDefaultWidth(i);}for (int i = 0; i < lastPosition; i++) {rightAll = rightAll + getDefaultWidth(i);}left = leftAll + (position * 2 + 1) * dis + positionOffset * (getDefaultWidth(position) + 2 * dis) + lineMargins;right = rightAll + (lastPosition * 2 + 1) * dis + getDefaultWidth(lastPosition) + lineMargins;dynamicLine.updateView(left, right);} else {if (positionOffset > 0.5f) {positionOffset = 0.5f;}for (int i = 0; i < position; i++) {leftAll = leftAll + getDefaultWidth(i);}for (int i = 0; i <= position; i++) {rightAll = rightAll + getDefaultWidth(i);}left = leftAll + (position * 2 + 1) * dis + lineMargins;right = rightAll + (position * 2 + 1) * dis + lineMargins + positionOffset * 2 * (getDefaultWidth(position + 1) + 2 * dis);dynamicLine.updateView(left, right);}} else {if (lastPosition > position) {for (int i = 0; i < position; i++) {leftAll = leftAll + getDefaultWidth(i);}for (int i = 0; i < lastPosition; i++) {rightAll = rightAll + getDefaultWidth(i);}left = leftAll + (position + positionOffset) * 2 * dis + dis + lineMargins + positionOffset * (lastWidth - lastDis);right = rightAll + (position + positionOffset) * 2 * dis + dis + lineMargins + positionOffset * lastWidth;dynamicLine.updateView(left, right);} else {for (int i = 0; i < position; i++) {leftAll = leftAll + getDefaultWidth(i);}for (int i = 0; i <= position; i++) {rightAll = rightAll + getDefaultWidth(i);}left = dis + leftAll + position * 2 * dis + lineMargins + positionOffset * 2 * dis + positionOffset * (lastWidth - lastDis);right = dis + rightAll + position * 2 * dis + lineMargins + positionOffset * 2 * dis + positionOffset * lastWidth;dynamicLine.updateView(left, right);}}} else {if (lineDrag) {if (lastPosition > position) {for (int i = 0; i < position; i++) {leftAll = leftAll + getDefaultWidth(i);}for (int i = 0; i < lastPosition; i++) {rightAll = rightAll + getDefaultWidth(i);}left = leftAll + (position + 1) * dis + positionOffset * (getDefaultWidth(position) + dis) + lineMargins;right = rightAll + (lastPosition + 1) * dis + getDefaultWidth(lastPosition) + lineMargins;dynamicLine.updateView(left, right);} else {if (positionOffset > 0.5f) {positionOffset = 0.5f;}for (int i = 0; i < position; i++) {leftAll = leftAll + getDefaultWidth(i);}for (int i = 0; i <= position; i++) {rightAll = rightAll + getDefaultWidth(i);}left = leftAll + (position + 1) * dis + lineMargins;right = rightAll + (position + 1) * dis + lineMargins + positionOffset * 2 * (getDefaultWidth(position + 1) + dis);dynamicLine.updateView(left, right);}} else {if (lastPosition > position) {for (int i = 0; i < position; i++) {leftAll = leftAll + getDefaultWidth(i);}for (int i = 0; i < lastPosition; i++) {rightAll = rightAll + getDefaultWidth(i);}left = leftAll + (position + positionOffset) * dis + dis + lineMargins + positionOffset * (lastWidth - lastDis);right = rightAll + (position + positionOffset) * dis + dis + lineMargins + positionOffset * lastWidth;dynamicLine.updateView(left, right);} else {for (int i = 0; i < position; i++) {leftAll = leftAll + getDefaultWidth(i);}for (int i = 0; i <= position; i++) {rightAll = rightAll + getDefaultWidth(i);}left = dis + leftAll + position * dis + lineMargins + positionOffset * dis + positionOffset * (lastWidth - lastDis);right = dis + rightAll + position * dis + lineMargins + positionOffset * dis + positionOffset * lastWidth;dynamicLine.updateView(left, right);}}}
通过判断,进行不同的逻辑处理(代码位置com.xp.different.MyOnPageChangeListener)
复制代码

四、B的使用

这种是借鉴的,如有侵犯,请联系,会及时删除

1)B的引用

   <com.xp.shadow.ShadowTabandroid:id="@+id/indicator"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#11000000"flexTitle:item_padding="15dp"flexTitle:text_size="16sp"flexTitle:default_color="#000000"flexTitle:changed_color="#ff0000"/>
复制代码

2)B的自定义

  <declare-styleable name="ShadowTab"><attr name="text_size"/><attr name="default_color"/><attr name="changed_color"/><attr name="item_padding_l" format="dimension"/><attr name="item_padding_r" format="dimension"/><attr name="item_padding_t" format="dimension"/><attr name="item_padding_b" format="dimension"/><attr name="item_padding" format="dimension"/><attr name="line_start_colors" format="color" />//线 起始颜色<attr name="line_end_colors" format="color" />//线 终止颜色<attr name="line_heights" format="dimension" />// 线的高度<attr name="line_bottom_margin" format="dimension" />//线 距下高度</declare-styleable>
复制代码

3)B的实现

根据位置绘制文字和线//画正常的文字内容paint.setTextSize(textSize);Paint.FontMetrics fontMetrics = paint.getFontMetrics();canvas.save();paint.setColor(defaultColor);canvas.drawText(text, textLeft, textBottom - fontMetrics.descent, paint);canvas.restore();//画渐变部分的文字canvas.save();paint.setColor(changeColor);canvas.clipRect(startX, 0, endX, getMeasuredHeight());canvas.drawText(text, textLeft, textBottom - fontMetrics.descent, paint);canvas.restore();
(代码位置com.xp.shadow.ShadowTextView)
复制代码

初次尝试,海涵。如有意见和建议,及时沟通。

转载于:https://juejin.im/post/5a952633f265da4e8700f709

Android新闻类导航栏相关推荐

  1. Android状态栏和导航栏透明和沉浸式模式

    最近在App上需要对状态栏进行相关的设置,在网上看了些文章,像郭神的沉浸式那篇博客对我启发蛮大,但是对状态栏的设置,包括隐藏,透明,颜色设置等,并没有比较系统的概念,实现方式不止一种,有操作Windo ...

  2. android MIPI屏 导航栏丢失

    /***************************************************************************** android MIPI屏 导航栏丢失* ...

  3. Android隐藏导航栏按键,Android如何控制导航栏单个按键的显隐状态

    我们都知道Android系统的导航栏通常有三个按键,分别是BACK, HOME, APP_SWITCH. 网上很多有关导航栏和状态栏显隐的文章,但几乎都是控制导航栏或状态栏所有按键同时显示或消失,如果 ...

  4. 关于Android系统隐藏导航栏的两种方法

    关于Android系统隐藏导航栏的两种方法 在NXP的imx6q和全志的A40I上试过 1.frameworks/base/core/res/res/values/dimens.xml中修改 < ...

  5. Android 10 修改导航栏的位置

    Android 10 修改导航栏的位置 代码路径: frameworks/base/servicescore/java/com/android/server/wm/DisplayPolicy.java ...

  6. Android 华为虚拟导航栏适配

    Android 华为虚拟导航栏适配 在写界面的时候 然后发现在界面最底下的几行文字 正好被虚拟导航栏遮挡住了,不滑动还看不到底下的文字,所以想隐去这些导航栏. 采用下面的代码将DecorView中的属 ...

  7. Android应用底部导航栏(选项卡)实例

    现在很多android的应用都采用底部导航栏的功能,这样可以使得用户在使用过程中随意切换不同的页面,现在我采用TabHost组件来自定义一个底部的导航栏的功能. 我们先看下该demo实例的框架图: 其 ...

  8. 禁用应用中Android系统的导航栏(特别是平板)

    由于公司项目是在全屏下的,所有界面都是全屏,唯有弹出提示框的时候,会出现系统的导航栏,由于是平板,导航栏信息比较多,该项目属于永不让用户进入原系统的项目.所以有导航栏,就让用户有了机会进入后台. 本今 ...

  9. android底部导航栏软件,三步搞定android应用底部导航栏

    很多android应用底部都有一个底部导航栏,方便用户在使用过程中随意切换.目前常用的做法有三种:一种是使用自定义tabHost,一种是使用activityGroup,一种是结合FrameLayout ...

最新文章

  1. python3 byte_「Python3学习笔记」读书笔记—字节数组
  2. 近期window7x64 打补丁之后IE11x64无法启动
  3. 5G NR RLC:RLC架构和RLC entity
  4. GitHub 配置 SSH 连接
  5. FIFO分枝_限界算法
  6. 你是否已经忘了Serlvet是什么?
  7. Flink-org.apache.flink.api.common.functions.AggregateFunction
  8. powerbi输入数据_与内部共享 Power BI 仪表板和报表
  9. TCP-IP 用户态编程
  10. (转)招商银行这一招,引起了各大银行的注意
  11. c语言儿童教学_五岁儿童的自然语言处理
  12. uniapp:微信小程序地图功能
  13. 名企笔试:2015小米暑期实习(风口的猪-中国牛市)(2017-04-09 算法爱好者)
  14. swper 实现滑动切换功能的两种方式
  15. Lingo求解线性规划案例1——生产计划问题
  16. Visionpro从小白到大佬,第一章了解工具名称和用途
  17. MOV AX,DATA MOV DS,AX
  18. 算法 64式 7、搜索算法整理_第3部分_31到45题
  19. 什么是cookie?什么是session?cookie与session有什么区别
  20. PPT如何导出高清eps?

热门文章

  1. UA MATH571B 试验设计 QE练习题 不使用代码分析试验结果I
  2. C语言二级指针Demo - Win32 版本
  3. 驱动程序实例(一):LED设备驱动程序( platform + cdev)
  4. php+sql创建本地项目详细步骤1——创建数据库数据表,数据库连接
  5. 如何构建高扩展性网站?
  6. C++标准:C++不允许修改任何基本型别(包括指针)的暂时值
  7. 远程linux服务器mysql数据库导入和导出.sql文件
  8. 如何使用Keil仿真环境查看CPU类型字长?【worldsing笔记】
  9. 【CSS3初探之变形与动画】令人惊叹的CSS3
  10. sqlserver excel,txt,access等文件的互導