Android 自定义视图之画图
首先简单的一个画矩形的例子
public class DrawView extends View {
public DrawView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint p = new Paint();
Rect t = new Rect(1,1,100,100);
canvas.drawRect(t.left, t.top, t.right, t.bottom, p);
}
}
重要的2个类
Canvas
画布, 用于绘制相关的图形
Canvas可以绘制的对象有:
弧线(arcs) canvas.
填充颜色(argb和color)
图 Bitmap
圆(circle和oval)
点(point)
线(line)
矩形(Rect)
图片(Picture)
圆角矩形 (RoundRect)
文本(text)
顶点(Vertices)
路径(path)
Canvas的基本操作有:
canvas.save():把当前的绘制的图像保存起来,让后续的操作相当于是在一个新的图层上的操作。
canvas.restore(); 把当前画布返回(调整)到上一个save()状态之前
canvas.translate(dx, dy); //把当前画布的原点移到(dx,dy),后面的操作都以(dx,dy)作为参照点,默认原点为(0,0)
canvas.scale(x,y);扩大。x为水平方向的放大倍数,y为竖直方向的放大倍数
canvas.rotate(angel):旋转.angle指旋转的角度,顺时针旋转。
canvas.transform():切变。所谓切变,其实就是把图像的顶部或底部推到一边。
canvas.saveLayer(bounds, paint, saveFlags);
示例
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint mPaint = new Paint();
// 绘制画布背景
canvas.drawColor(Color.GRAY);
//设置画笔颜色
mPaint.setColor(Color.BLUE);
//设置画笔为空心 如果将这里改为Style.STROKE 这个图中的实线圆柱体就变成了空心的圆柱体
mPaint.setStyle(Paint.Style.STROKE);
//绘制直线
canvas.drawLine(50, 50, 450, 50, mPaint);
//绘制矩形
canvas.drawRect(100, 100, 200, 300, mPaint);
//绘制矩形
mPaint.setStyle(Paint.Style.FILL);
canvas.drawRect(300, 100, 400, 400, mPaint);
mPaint.setColor(Color.YELLOW);
RectF r = new RectF(150, 500, 270, 600);
// 画矩形
canvas.drawRect(r, mPaint);
// 画圆
canvas.drawCircle(50, 500, 50, mPaint);
RectF oval = new RectF(350, 500, 450, 700);
// 画椭圆
canvas.drawOval(oval, mPaint);
RectF rect = new RectF(100, 700, 170, 800);
// 画圆角矩形
canvas.drawRoundRect(rect, 30, 20, mPaint);
//绘制圆弧 绘制弧形
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(Color.RED);
RectF re1 = new RectF(1000, 50, 1400, 200);
canvas.drawArc(re1, 10, 270, false, mPaint);
RectF re2 = new RectF(1000, 300, 1400, 500);
canvas.drawArc(re2, 10, 270, true, mPaint);
//设置Path路径
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(Color.GREEN);
mPaint.setStrokeWidth(3);
Path path = new Path();
path.moveTo(500, 100);
path.lineTo(920, 80);
path.lineTo(720, 200);
path.lineTo(600, 400);
path.close();
mPaint.setTextSize(46);
canvas.drawPath(path, mPaint);
canvas.drawTextOnPath("***TEST**", path, -20, -20, mPaint);
//三角形
path.moveTo(10, 330);
path.lineTo(70, 330);
path.lineTo(40, 270);
path.close();
canvas.drawPath(path, mPaint); // 画三角形
canvas.save();
}
Paint
绘制笔,绘制图形时的属性
基本用法
Paint paint = new Paint();
// 设置字体颜色
paint.setColor(Color.RED);
// 防锯齿
paint.setAntiAlias(true);
//设置颜色过滤器,可以在绘制颜色时实现不用颜色的变换效果
paint.setColorFilter(ColorFilter);
//如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示
//速度,本设置项依赖于dither和xfermode的设置
paint.setFilterBitmap(true);
//当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度
paint.setStrokeWidth(10f);
//设置绘制路径的效果,如点画线等
paint.setPathEffect(PathEffect);
//设置图像效果,使用Shader可以绘制出各种渐变效果
// Shader.TileMode三种模式
// REPEAT:沿着渐变方向循环重复
// CLAMP:如果在预先定义的范围外画的话,就重复边界的颜色
// MIRROR:与REPEAT一样都是循环重复,但这个会对称重复
Shader shader = new LinearGradient(0, 0, 100, 100,
new int[]{Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW},
null, Shader.TileMode.REPEAT);
paint.setShader(shader);
//设置MaskFilter,可以用不同的MaskFilter实现滤镜的效果,如滤化,立体等
paint.setMaskFilter(MaskFilter);
//在图形下面设置阴影层,产生阴影效果,radius为阴影的角度,dx和dy为阴影在x轴和y轴上的距离,color为阴影的颜色
paint.setShadowLayer(float radius, float dx, float dy, int color);
//设置画笔的样式,为FILL,FILL_OR_STROKE,或STROKE
paint.setStyle(Paint.Style);
//当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的图形样式,圆形样式ROUND,或方形样式SQUARE BUTT
paint.setStrokeCap(Paint.Cap);
//设置绘制时画笔与图形的结合方式,METER\ROUND\BEVEL 平滑效果
paint.setSrokeJoin(Paint.Join);
// 字体下划线
paint.setUnderlineText(true);
// 暂时不知,有清楚的可以告诉我,谢谢
paint.setLinearText(true);
// 字体加粗
paint.setFakeBoldText(true);
// 防抖动
paint.setDither(true);
// 透明度
paint.setAlpha(0xF0);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。