Paint类代表画笔,Canvas类代表画布。
Paint类
Paint类代表画笔,用来描述图形的颜色和风格,如线宽、颜色、透明度和填充效果等信息。创建方法:
Paint paint = new Paint();
Paint类常用方法
方法 | 描述 |
---|---|
setARGB(int a, int r, int g, int b) | 设置颜色 |
setColor(int color) | 设置颜色 |
setAlpha(int a) | 设置透明度,值为0~255 |
setAntiAlias(boolean aa) | 指定使用使用抗锯齿功能,如果使用会使绘图速度变慢 |
setDither(boolean dither) | 指定是否使用图像抖动处理,如果使用会使图像颜色更加平滑和饱满 |
setPathEffect(PathEffect effect) | 设置绘制路径时的路径效果,例如点画线 |
setShader(Shader shader) | 设置渐变,可以使用LinearGradient(线性渐变)、RadialGradient(径向渐变)或者SweepGradient(角度渐变) |
setShadowLayer(float radius, float dx, float dy, int color) | 设置阴影,参数radius为阴影的角度,dx和dy为阴影在x轴和y轴上的距离,color为阴影的颜色。如果radius为0,将没有阴影 |
setStrokeCap(Paint.Cap cap) | 用于当画笔的填充样式为STROKE或FILL_AND_STROKE时,设置笔刷的图形样式,参数值可以是Cap.BUTT、Cap.ROUND或Cap.SQUARE。主要体现在线的端点上 |
setStrokeJoin(Paint.Join join) | 用于设置画笔转弯处的连接风格,参数值为Join.BEVEL、Join.MITER或Join.ROUND |
setStrokeWidth(float width) | 设置笔触的宽度 |
setStyle(Paint.Style style) | 设置填充风格,参数值为Style.FILL、Style.FILL_AND_STROKE或Style.STROKE |
setTextAlign(Paint.Align align) | 设置绘制文本时的文字对齐方式,参数为Align.CENTER、Align.LEFT或Align.RIGHT |
setTextSize(float textSize) | 设置绘制文本时的文字大小 |
setFakeBoldText(boolean fakeBoldText) | 设置是否为粗体文字 |
setXfermode(Xfermode xfermode) | 设置图形重叠时的处理方式,例如合并、取交集或并集,经常用来制作橡皮的擦除效果 |
Canvas类
Canvas类代表画布,通过该类提供的方法,可以绘制各种图形(例如,矩形、圆形和线条等)。通常,要在Android中绘图,需要先创建一个继承自View类的视图,并重写onDraw(Canvas canvas)
方法,然后再显示绘图的Activity中添加该视图。
绘制几何图形
方法 | 描述 |
---|---|
drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint) | 绘制弧 |
drawCircle(float cx, float cy, float radius, Paint paint) | 绘制圆形 |
drawLine(float startX, float startY, float stopX, float stopY, Paint paint) | 绘制一条线 |
drawLines(float[] pts, Paint paint) | 绘制多条线 |
drawOval(RectF oval, Paint paint) | 绘制椭圆 |
drawPoint(float x, float y, Paint paint) | 绘制一个点 |
drawPoints(float[] pts, Paint paint) | 绘制多个点 |
drawRect(float left, float top, float right, float bottom, Paint paint) | 绘制矩形 |
drawRoundRect(RectF rect, float rx, float ry, Paint paint) | 绘制圆角矩形 |
例子,绘制五个不同颜色的圆组成的图案。
创建一个名称为MyView的内部类,改类继承自android.view.View类,如下:
package com.example.drawcircle;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.view.View;
public class MyView extends View{
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.WHITE);//设置画布的背景色为白色
Paint paint = new Paint();//创建采用默认设置的画笔
paint.setAntiAlias(true);//使用抗锯齿功能
paint.setStrokeWidth(3);//设置笔触的宽度
paint.setStyle(Style.STROKE);//设置填充样式为描边
paint.setColor(Color.BLUE);
canvas.drawCircle(50, 50, 30, paint);//绘制蓝色的圆形
paint.setColor(Color.YELLOW);
canvas.drawCircle(100, 50, 30, paint);//绘制黄色的圆形
paint.setColor(Color.BLACK);
canvas.drawCircle(150, 50, 30, paint);//绘制黑色的圆形
paint.setColor(Color.GREEN);
canvas.drawCircle(75, 90, 30, paint);//绘制绿色的圆形
paint.setColor(Color.RED);
canvas.drawCircle(125, 90, 30, paint);//绘制红色的圆形
}
}
在MainActivity的onCreate()方法,获取布局文件,添加MyView视图:
FrameLayout frameLayout = (FrameLayout) findViewById(R.id.frameLayout1);
frameLayout.addView(new MyView(this, null));
最终的结果为:
绘制一个android机器人:
Paint paint = new Paint();//采用默认设置创建一个画笔
paint.setAntiAlias(true);//使用抗锯齿功能
paint.setColor(0xFFA4C739);//设置画笔的颜色为绿色
//绘制机器人的头
RectF rectF_head = new RectF(10, 10, 100, 100);
rectF_head.offset(100, 20);
canvas.drawArc(rectF_head, -10, -160, false, paint);//绘制弧
//绘制眼睛
paint.setColor(Color.WHITE);//设置画笔的颜色为白色
canvas.drawCircle(135, 53, 4, paint);//绘制圆
canvas.drawCircle(175, 53, 4, paint);//绘制圆
paint.setColor(0xFFA4C739);//设置画笔的颜色为绿色
//绘制天线
paint.setStrokeWidth(2);//设置笔触的宽度
canvas.drawLine(120, 15, 135, 35, paint);//绘制线
canvas.drawLine(190, 15, 175, 35, paint);//绘制线
//绘制身体
canvas.drawRect(110, 75, 200, 150, paint);//绘制矩形
RectF rectF_body = new RectF(110, 140, 200, 160);
canvas.drawRoundRect(rectF_body, 10, 10, paint);//绘制圆角矩形
//绘制胳膊
RectF rectF_arm = new RectF(85, 75, 105, 140);
canvas.drawRoundRect(rectF_arm, 10, 10, paint);//绘制左侧的胳膊
rectF_arm.offset(120, 0);//设置X轴上偏移120像素
canvas.drawRoundRect(rectF_arm, 10, 10, paint);//绘制右侧的胳膊
//绘制腿
RectF rectF_leg = new RectF(125, 150, 145, 200);
canvas.drawRoundRect(rectF_leg, 10, 10, paint);//绘制左侧的腿
rectF_leg.offset(40, 0);
canvas.drawRoundRect(rectF_leg, 10, 10, paint);//绘制右侧的腿
绘制文本
drawText()方法用于在画布的指定位置绘制文字。常用方法如下;
drawText(String text, float x, float y, Paint paint)
drawPosText()方法也可用于在画布上绘制文字,使用该方法需要为每个字符指定一个位置。
drawPosText(String text, float[] pos, Paint paint)
例子
Paint paintText = new Paint();//创建一个采用默认设置的画笔
paintText.setColor(0xFFFF6600);//设置画笔颜色
paintText.setTextAlign(Align.LEFT);//设置文字左对齐
paintText.setTextSize(18);//设置文字大小
paintText.setAntiAlias(true);//使用抗锯齿功能
canvas.drawText("Hello,Android", 163, 60, paintText);//通过drawText()方法绘制文字
绘制路径
Path类常用方法
Tables | Are |
---|---|
addArc(RectF oval, float startAngle, float sweepAngle) | 添加弧形路径 |
addCircle(float x, float y, float radius, Path.Direction dir) | 添加圆形路径 |
addOval(RectF oval, Path.Direction dir) | 添加椭圆形路径 |
addRect(RectF rect, Path.Direction dir) | 添加矩形路径 |
addRoundRect(RectF rect, float rx, float ry, Path.Direction dir) | 添加圆角矩形路径 |
moveTo(float x, float y) | 设置开始绘制直线的起始点 |
lineTo(float x, float y) | 在moveTo()方法设置的起始点与该方法指定的结束点之间绘制一条直线 |
quadTo(float x1, float y1, float x2, float y2) | 用于根据指定参数绘制一条线段轨迹 |
close() | 闭合路径 |
例子
Paint paint = new Paint();//创建一个画笔
paint.setAntiAlias(true);//设置使用抗锯齿功能
paint.setColor(0xFFFF6600);//设置画笔颜色
paint.setTextSize(18);//设置文字大小
paint.setStyle(Style.STROKE);//设置填充方式为描边
//绘制圆形路径
Path pathCircle = new Path();
pathCircle.addCircle(70, 70, 40, Path.Direction.CCW);//添加逆时针的圆形路径
canvas.drawPath(pathCircle, paint);//绘制路径
//绘制折现路径
Path pathLine = new Path();
pathLine.moveTo(150, 100);
pathLine.lineTo(200, 45);
pathLine.lineTo(250, 100);
pathLine.lineTo(300, 80);
canvas.drawPath(pathLine, paint);
//绘制三角形路径
Path pathTr = new Path();
pathTr.moveTo(350, 80);
pathTr.lineTo(400, 30);
pathTr.lineTo(450, 80);
pathTr.close();
canvas.drawPath(pathTr, paint);
//绘制绕路径的环形文字
String str = "人生不想见,动如参与商";
Path path = new Path();
path.addCircle(200, 180, 32, Path.Direction.CW);//添加顺时针的圆形路径
paint.setStyle(Style.FILL);
canvas.drawTextOnPath(str, path, 0, -18, paint);
Bitmap类
Bitmap类代表位图,使用它不仅可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,而且还可以指定格式保存图像文件。
Bitmap类常用方法:
方法 | 描述 |
---|---|
compress(Bitmap.CompressFormat format, int quality, OutputStream stream) | 用于将Bitmap对象压缩为指定格式并保存到指定的文件输出流中,其中format参数值为Bitmap.CompressFormat.JPEG,Bitmap.CompressFormat.PNG,Bitmap.CompressFormat.WEBP |
createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter) | 用于从源位图的指定左边点开始,“挖取”指定宽度和高度的一块图像来创建新的Bitmap对象,并按Matrix指定规则进行变换 |
createBitmap(int width, int height, Bitmap.Config config) | 用于创建一个指定宽度和高度的新的Bitmap对象 |
createBitmap(Bitmap source, int x, int y, int width, int height) | 用于从源位图的指定坐标点开始,“挖取”指定宽度和高度的一块图像来创建新的Bitmap对象 |
createBitmap(int[] colors, int width, int height, Bitmap.Config config) | 使用颜色数组创建一个指定宽度和高度的新的Bitmap对象,其中,数组元素的个数为width*height |
createBitmap(Bitmap src) | 用于使用源位图创建一个新的Bitmap对象 |
createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter) | 用于将源位图缩放为指定宽度和高度的新的Bitmap对象 |
isRecycled() | 用于判断Bitmap对象是否被回收 |
recycle() | 强制回收Bitmap对象 |
BitmapFactory类
该类是一个工具类,用于从不同的数据源来解析、创建Bitmap对象。
方法 | 描述 |
---|---|
decodeFile(String pathName) | 用于从给定的路径所指定的文件中解析、创建Bitmap对象 |
decodeFileDescriptor(FileDescriptor fd) | 用于从FileDescriptor对应的文件中解析、创建Bitmap对象 |
decodeResource(Resources res, int id) | 用于根据给定的资源ID从指定的资源中解析、创建Bitmap对象 |
decodeStream(InputStream is) | 用于从指定的输入流中解析、创建Bitmap对象 |