自定义Linearlayout,实现dividerPaddingLeft和dividerPaddingRight

本文介绍了如何在Android项目中优雅地实现分割线效果,特别是针对iOS风格的分割线,即左侧有距离,右侧紧贴边界的布局。通过分析LinearLayout的源码,发现默认的dividerPadding属性无法满足需求。于是,作者提出了自定义LinearLayout,重写drawHorizontalDivider和drawVerticalDivider方法来实现dividerPaddingLeft和dividerPaddingRight的功能,以此避免使用空View和额外的padding带来的问题。
摘要由CSDN通过智能技术生成

         在项目中经常会用到分割线,很多应用的“我的”模块,都会用到分割线,那么怎么优雅的实现这种很简单的效果呢?

         实现它一般最简单最麻烦的方法可能就是Linearlayout然后里面每个子view之间用一个view,然后设置背景,然后高度设置为1px了,其实,最初我也这么搞过,但是效率实在是低呀,后来知道了Linearlayout自己就有实现分割线的属性了,就是一个divider属性,它指向的是一个drawable文件了,既然是drawable,那么可定制化的东西就很多了,然后showDividers是指这个分割线显示的位置,同样可能用到的一个属性就是dividerPadding了,它是指代分割线距离边界的距离,距离两边都有哦,说的这些大家也都知道。

         以前这么用也没什么问题,后来ui设计师又要仿照ios了,ios的分割线一般都是距离左边有一段距离,而对于右边则是顶边的,那么单纯的设置dividerPadding是不可以的,有的同学说,我可以直接给该linearlayout设置一个paddingLeft呀,这样子也没问题,可是要是要加点击效果呢?设置了paddingLeft后,点击效果背景变化也会距离左边一段距离呀。那怎么办?难道又要回到设置通过设置空view然后设置背景的老路了吗?其实此刻想的是要是Android提供一个dividerPaddingLeft该多好呀。可是现实是人家没提供。

        然后就去看看linearlayout中关于dividerPadding到底是怎么处理的吧,或许我们可以自定义下呢,首先是可以看到通过mDividerPadding = a.getDimensionPixelSize(R.styleable.LinearLayout_dividerPadding, 0);通过这个属性获取到xml中设置的dividerPadding的值,然后看到用到的地方就是两个地方:

void drawHorizontalDivider(Canvas canvas, int top) {
        mDivider.setBounds(getPaddingLeft() + mDividerPadding, top, getWidth() - getPaddingRight() - mDividerPadding, top + mDividerHeight);
        mDivider.draw(canvas);
    }

       可以看到一个是绘制竖直方向上的分割线,一个则是绘制水平方向上的分割线的,其实我们要是能把这两个方法给改了,那就不达到了我们变相设置dividerPaddingLeft的效果了嘛,其实我们只需要将第一个方法drawHorizontalDivider改为如下方式就好了,

void drawHorizontalDivider(Canvas canvas, int top) {
        mDivider.setBounds(getPaddingLeft() + mDividerPadding, top, getWidth() - getPaddingRight(), top + mDividerHeight);
        mDivider.draw(canvas);
    }

只修要将mDivider的setBounds的第三个设置right方向距离的参数改下就好了。然后我们的目标明确了,接下来就是实现了,哈哈哈。

        看了下,linearlayout的代码还是蛮多的

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值