LinearLayout分割线.md

实现LinearLayout主要用到的三个属性

android:showDivider

定义分割线的位置


image.png
  • middle:分割线在子view之间
  • none:未定义分割线位置
  • beginning:分割线在开始位置
  • end:分割线在结尾位置
    当然,这些属性可以组合使用,这里还有一个5.0的一个bug,就是设置showDividers = "end"时,在android5.0系统,结尾位置的分割线是显示不出来的,这里就不详细讨论这个问题了

android:divider

设置分割线的drawable,必须是drawable,不能是color,并且drawable必须要有宽或者高,如果LinearLayout的横向的,则必须要有宽度,如果是纵向的,则divider必须要有高度。

android:dividerPadding

这个属性是我们这篇文章索要详细讲的,乍一看,dividerPadding指的是divider的padding,还是不明白,我们来看下源码吧,找到画divider的位置

    @Override
    protected void onDraw(Canvas canvas) {
        if (mDivider == null) {
            return;
        }
        if (mOrientation == VERTICAL) {
            drawDividersVertical(canvas);
        } else {
            drawDividersHorizontal(canvas);
        }
    }

以mOrientation为水平方向为例,则查看drawDividersHorizontal方法,

    void drawDividersHorizontal(Canvas canvas) {
        final int count = getVirtualChildCount();
        final boolean isLayoutRtl = isLayoutRtl();
        for (int i = 0; i < count; i++) {
            final View child = getVirtualChildAt(i);
            if (child != null && child.getVisibility() != GONE) {
                if (hasDividerBeforeChildAt(i)) {
                    final LayoutParams lp = (LayoutParams) child.getLayoutParams();
                    final int position;
                    if (isLayoutRtl) {
                        position = child.getRight() + lp.rightMargin;
                    } else {
                        position = child.getLeft() - lp.leftMargin - mDividerWidth;
                    }
                    drawVerticalDivider(canvas, position);
                }
            }
        }

        if (hasDividerBeforeChildAt(count)) {
            final View child = getLastNonGoneChild();
            int position;
            if (child == null) {
                if (isLayoutRtl) {
                    position = getPaddingLeft();
                } else {
                    position = getWidth() - getPaddingRight() - mDividerWidth;
                }
            } else {
                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
                if (isLayoutRtl) {
                    position = child.getLeft() - lp.leftMargin - mDividerWidth;
                } else {
                    position = child.getRight() + lp.rightMargin;
                }
            }
            drawVerticalDivider(canvas, position);
        }
    }

直接看hasDividerBeforeChildAt,意思是是否有分割线在某个子view的前面,假设我们有两个子view,分割线显示位置为middle,分割线显示在两个子view的中间

    

        

        
    
image.png
              if (isLayoutRtl) {
                    position = child.getLeft() - lp.leftMargin - mDividerWidth;
                } else {
                    position = child.getRight() + lp.rightMargin;
                }

接着看 position = child.getLeft() - lp.leftMargin - mDividerWidth;
position就是画divider的起始位置,然后再来看

    void drawVerticalDivider(Canvas canvas, int left) {
        mDivider.setBounds(left, getPaddingTop() + mDividerPadding,
                left + mDividerWidth, getHeight() - getPaddingBottom() - mDividerPadding);
        mDivider.draw(canvas);
    }

现在我们就知道,dividerPadding起到的作用了,当LinearLayout为水平方向布局时,dividerPadding为divider离顶部的距离和离底部的距离,这样就可以控制divider的高度了。

你可能感兴趣的:(LinearLayout分割线.md)