Android中shape通常用法

前言

线条的设置在APP中用的地方是很多的,比如很多小模块之间的分割,而这些绝大多数用shape都是可以实现的,但是在实际的使用中也会有小坑,比如如果是虚线呢 ?如果那条虚线要是垂直的呢?所以这里简单的实现以下让我们来趟一趟这浑水。

shape实线

如果要实现肯定会有人说这个简单用view也可以啊我把它的height设置成1dp在给个背景颜色不就可以了吗,说的确实很有道理我也这样做过要是用shape呢?

shape其实就是在drawable下面新建xml文件并且可以实现一些形状的图形

,或者是颜色减半的效果,它相比PNG图片占用的空间更小也比 自定义View实现的更简单。

可以看见注解也比较详细有几个属性重点说一下:

shape 这个属性来设置你要设置的边框形状:rectangle 矩形(默认)line:线条ring: 环形oval:椭圆
corners标签:gradient标签 padding标签

shape虚线:

如果是用shape来实现虚线的话也比较简单:

但是有几个地方我们得搞清楚像:width其实表示的是虚线的宽度 dashGap 表示的是线段与线段之间的间隔 而dashwidth表示的是线段之间的宽度,当然重中之重就是 android:layerType=”software”一定要在你使用虚线的地方加上。

竖直的虚线

如果谁前两个用shape很好设置的话这个如果是shape就会有问题了由于宽和高的不确定性导致你 用shape来设置的时候就会对它边上的布局有影响这里就必须得自定义View来实现了:

public class JDottedLine extends View { private Paint mDotPaint; public JDottedLine(Context context) { super(context); initView(); } public JDottedLine(Context context, @Nullable AttributeSet attrs) { super(context, attrs); initView(); } public JDottedLine(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(); } private void initView() { mDotPaint = new Paint(); mDotPaint.setColor(Color.parseColor("#FF6677")); //画笔颜色 mDotPaint.setStrokeWidth(2); //画笔宽度 // 1、STROKE 描边 // 2、FILL_AND_STROKE 填充内部和描边 // 3、FILL:填充内部 mDotPaint.setStyle(Paint.Style.STROKE); //1、Cap.BUTT 这条路径结束,而不是超越它。 //2、Cap.ROUND 结束是个半圆 //3、Cap.SQUARE 结束是个方形 mDotPaint.setStrokeCap(Paint.Cap.ROUND);// //设置抗锯齿 mDotPaint.setAntiAlias(true); //设置是否抖动 mDotPaint.setDither(true); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); float startY = getHeight(); float startX = getWidth() / 2; DashPathEffect dashPathEffect = new DashPathEffect(new float[]{8, 10, 8, 10}, 0); mDotPaint.setPathEffect(dashPathEffect); Path path = new Path(); path.moveTo(startX,0); path.lineTo(startX,startY); canvas.drawPath(path,mDotPaint); } }

到这 基本上我们想要的几种效果就实现了我们只需要加一下background