一、自定义View
自定义属性
- 以ZzHorizontalProgressBar为例
1 | //attrs.xml |
1 | TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SomeWidgetName); |
Paint相关
设置文字大小
1 | mPaint.setTextSize(AutoUtils.getPercentWidthSize(20)); |
获取文字宽度
1 | float textWidth = mPaint.measureText(text); |
获取文字高度
1 | float textHeight = mPaint.descent() - mPaint.ascent(); |
获取文字基线
1 | //posX 和 posY 为文字的左上角的坐标 |
透明度
1 | mPaint.setAlpha(255); //0~255 |
抗锯齿
1 | mPaint.setAntiAlias(true); |
颜色
1 | mPaint.setColor(Color.WHITE); |
填充样式
填充
1 | mPaint.setStyle(Paint.Style.FILL); |
边框
1 | mPaint.setStyle(Paint.Style.STROKE); |
1 | mPaint.setStyle(Paint.Style.FILL_AND_STROKE); |
渐变色
线性渐变
1 | //以画渐变进度条为例 |
LinearGradient构造方法说明
1 | public LinearGradient(float x0, float y0,float x1, float y1, int colors[], float positions[],TileMode tile){} |
- x0 渐变线起点的x坐标
- y0 渐变线起点的y坐标
- x1 渐变线结束处的x坐标
- y1 渐变线结束处的y坐标
- colors 沿渐变线分布的颜色
- positions 可能为null,颜色数组中每个对应颜色的相对位置[0..1]。如果它为空,则颜色沿梯度线均匀分布
- tile 着色器平铺模式
弧形渐变
1 | SweepGradient shader = new SweepGradient(getWidth() / 2, getHeight() / 2, startProgressColor, endProgressColor); |
SweepGradient构造方法说明
1 | public SweepGradient(float cx, float cy, @ColorInt int color0, @ColorInt int color1) {} |
- cx 中心的x坐标
- cy 中心的y坐标
- color0 在扫描开始时使用的颜色
- color1 扫描结束时使用的颜色
Canvas相关
文字
1 | canvas.drawText(textTop, posX, baseLineY, mPaint); |
方法说明
1 | public void drawText(@NonNull String text, float x, float y, @NonNull Paint paint){} |
- text 要绘制的文本
- x 正在绘制的文本原点的x坐标
- y 正在绘制的文本的基线的y坐标,注意是baseLine的坐标
- paint 用于绘制文本的画笔
圆形
1 | //设置实心 |
圆环
1 | //设置空心 |
方法说明
1 | public void drawCircle(float cx, float cy, float radius, @NonNull Paint paint){} |
- cx 要绘制的圆的中心的x坐标
- cy 要绘制的圆的中心的y坐标
- radius 要绘制的圆的半径
- paint 用于绘制圆的画笔
矩形
圆角矩形
扇形
1 | canvas.drawArc(outRect, mData.getStartAngle(), mData.getSwipeAngle(), true, mPaint); |
方法说明
1 | public void drawArc(@NonNull RectF oval, float startAngle, float sweepAngle, boolean useCenter, @NonNull Paint paint){} |
- oval 椭圆的边界用于定义弧的形状和大小
- startAngle 圆弧开始的起始角度(以度为单位)
- sweepAngle 扫描角度(以度为单位)顺时针测量
- useCenter 如果为true,则将椭圆的中心包含在弧中,如果为false,则将其关闭。这将画一个楔子
- paint 用于绘制弧线的画笔
贝塞尔曲线
直线
1 | //垂直直线 |
图片
三角形
1 | Path path = new Path(); |
五角星
网格
1 | private void drawGrid(Canvas canvas) { |