自定义View
• 自定义绘制的方式是重写绘制方法,其中最常用的是 onDraw()
• 绘制的关键是 Canvas 的使用
o Canvas 的绘制类方法: drawXXX() (关键参数:Paint)
o Canvas 的辅助类方法:范围裁切和几何变换
• 可以使用不同的绘制方法来控制遮盖关系
@Override
protected void onDraw(Canvas canvas) {
// 2.画背景大圆弧
int centerX = mViewWidth / 2;
int centerY = mViewHeight / 2;
// 设置圆弧画笔的宽度
mPaint.setStrokeWidth(mRoundWidth);
// 设置为 ROUND
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeJoin(Paint.Join.ROUND);
// 设置画笔颜色
mPaint.setColor(mRoundColor);
mPaint.setStyle(Paint.Style.STROKE);
// 半径
int radius = (int) (centerX - mRoundWidth);
RectF oval = new RectF(centerX - radius, centerY - radius, centerX + radius, centerY + radius);
// 画背景圆弧
canvas.drawArc(oval, mStartAngle, mSweepAngle, false, mPaint);
}
1、Paint相关类
1.1设置颜色
• paint.setColor(Color.parseColor(“#009688”));
• canvas.drawRect(30, 30, 230, 180, paint);
•
• paint.setColor(Color.parseColor(“#FF9800”));
• canvas.drawLine(300, 30, 450, 180, paint);
•
• paint.setColor(Color.parseColor(“#E91E63”));
• canvas.drawText(“HenCoder”, 500, 130, paint);
1.2setShader(Shader shader) 设置 Shader
在 Android 的绘制里使用 Shader ,并不直接用 Shader 这个类,而是用它的几个子类。具体来讲:LinearGradient RadialGradient SweepGradient BitmapShader ComposeShader
1.2.1 LinearGradient 线性渐变
设置两个点和两种颜色,以这两个点作为端点,使用两种颜色的渐变来绘制颜色。就像这样:
Shader shader = new LinearGradient(100, 100, 500, 500, Color.parseColor(“#E91E63”),
Color.parseColor(“#2196F3”), Shader.TileMode.CLAMP);
paint.setShader(shader);
canvas.drawCircle(300, 300, 200, paint);
构造方法:
LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile)
1.2.2 RadialGradient 辐射渐变
辐射渐变很好理解,就是从中心向周围辐射状的渐变。
Shader shader = new RadialGradient(300, 300, 200, Color.parseColor(“#E91E63”),
Color.parseColor(“#2196F3”), Shader.TileMode.CLAMP);
paint.setShader(shader);
canvas.drawCircle(300, 300, 200, paint);
构造方法:
RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, TileMode tileMode)。
1.2.3 BitmapShader
其实也就是用 Bitmap 的像素来作为图形或文字的填充
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.batman);
Shader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
paint.setShader(shader);
canvas.drawCircle(300, 300, 200, paint);
1.3 设置paint 效果
1.3.1 setStyle(Paint.Style style)
抗锯齿默认是关闭的,如果需要抗锯齿,需要显式地打开。另外,除了 setAntiAlias(aa) 方法,打开抗锯齿还有一个更方便的方式:构造方法。创建 Paint 对象的时候,构造方法的参数里加一个 ANTI_ALIAS_FLAG的 flag,就可以在初始化的时候就开启抗锯齿。
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
1.3.2 setStyle(Paint.Style style)
填充模式
paint.setStyle(Paint.Style.FILL); // FILL 模式,填充
canvas.drawCircle(300, 300, 200, paint);
paint.setStyle(Paint.Style.STROKE); // STROKE 模式,画线
canvas.drawCircle(300, 300, 200, paint);
paint.setStyle(Paint.Style.FILL_AND_STROKE); // FILL_AND_STROKE 模式,填充 + 画线
canvas.drawCircle(300, 300, 200, paint);
1.3.3线条形状
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(1);
canvas.drawCircle(150, 125, 100, paint);
paint.setStrokeWidth(5);
canvas.drawCircle(400, 125, 100, paint);
paint.setStrokeWidth(40);
canvas.drawCircle(650, 125, 100, paint);
1.3.4线条效果
setPathEffect(PathEffect effect)
PathEffect pathEffect = new DashPathEffect(new float[]{10, 5}, 10);
paint.setPathEffect(pathEffect);
canvas.drawCircle(300, 300, 200, paint);
1.4 drawText() 相关
Paint 有些设置是文字绘制相关的,即和 drawText() 相关的