public void drawRect(@NonNull Rect r, @NonNull Paint paint)
public void drawRect(@NonNull RectF rect, @NonNull Paint paint)
canvas.drawRect(0,0,400,400,mPaint);
// or
Rect rect = new Rect(0,0,400,400);
canvas.drawRect(rect,mPaint);
// or
RectF rectF = new RectF(0,0,400,400);
canvas.drawRect(rectF,mPaint);
// API 21 提供
canvas.drawRoundRect(100,100,500,500,20,20,mPaint);
// or
RectF rectF = new RectF(100,100,500,500);
canvas.drawRoundRect(rectF,20,20,mPaint);
当rx或者ry的值大于矩形的一半时,按照一半进行处理:
// API 21 提供
canvas.drawRoundRect(100,100,500,500,250,250,mPaint);
// or
RectF rectF = new RectF(100,100,500,500);
canvas.drawRoundRect(rectF,250,250,mPaint);
RectF rect = new RectF(0,0,400,400);
canvas.drawRect(rect,mPaint);
canvas.scale(0.5f,0.5f);//画布缩小一半
mPaint.setColor(getResources().getColor(R.color.purple));
canvas.drawRect(rect,mPaint);
设置缩放中心位置
RectF rect = new RectF(0,0,400,400);
canvas.drawRect(rect,mPaint);
canvas.scale(0.5f,0.5f,200,200);//画布缩小一半
mPaint.setColor(getResources().getColor(R.color.purple));
canvas.drawRect(rect,mPaint); // 绘制蓝色矩形
canvas.drawRect(rect,mPaint);
RectF rect = new RectF(0,0,600,400);
canvas.drawRect(rect,mPaint);
canvas.scale(-0.5f,-0.5f,600,400);//画布缩小一半
mPaint.setColor(getResources().getColor(R.color.purple));
canvas.drawRect(rect,mPaint);
本次缩放可以看做是先根据缩放中心(坐标原点)缩放到原来的0.5倍,然后分别按照x轴和y轴进行翻转。
旋转(rotate)
canvas提供了两个旋转的方法:
public void rotate (float degrees)
public final void rotate (float degrees, float px, float py)
和缩放一样,第二种方法多出来的两个参数依旧是控制旋转中心点的。
默认的旋转中心依旧是坐标原点:
canvas.translate(200,200);
RectF rect = new RectF(0,0,200,200); // 矩形区域
canvas.drawRect(rect,mPaint);
mPaint.setColor(getResources().getColor(R.color.purple));
canvas.rotate(45);
canvas.drawRect(rect,mPaint);
canvas.translate(200,200);
RectF rect = new RectF(0,0,200,200); // 矩形区域
canvas.drawRect(rect,mPaint);
mPaint.setColor(getResources().getColor(R.color.purple));
canvas.rotate(45,100,100);
canvas.drawRect(rect,mPaint);
mPaint.setStyle(Paint.Style.STROKE);
RectF rect = new RectF(0,0,200,200);
canvas.drawRect(rect,mPaint);
canvas.skew(1,0);
mPaint.setColor(getResources().getColor(R.color.purple));
canvas.drawRect(rect,mPaint);
绘制图片
绘制Bitmap
Canvas提供了如下绘制Bitmap的方法:
//第一类
public void drawBitmap (Bitmap bitmap, Matrix matrix, Paint paint)
//第二类绘制时指定了图片左上角的坐标(距离坐标原点的距离)
public void drawBitmap (Bitmap bitmap, float left, float top, Paint paint)
//第三类绘制图片的部分区域
//src指定绘制图片的区域,dst指定图片在屏幕上显示的区域
public void drawBitmap (Bitmap bitmap, Rect src, Rect dst, Paint paint)
public void drawBitmap (Bitmap bitmap, Rect src, RectF dst, Paint paint)
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.cat);
canvas.drawBitmap(bitmap, new Matrix(), mPaint);
绘制部分区域
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.cat);
// 指定图片绘制区域
Rect src = new Rect(0,0,bitmap.getWidth()/2,bitmap.getHeight()/2);
// 指定图片在屏幕上显示的区域
Rect dst = new Rect(0,0,bitmap.getWidth(),bitmap.getHeight());
canvas.drawBitmap(bitmap, src,dst, mPaint);
绘制文字
canvas提供如下绘制文字的方法
// 第一类 指定文本基线位置(基线x默认在字符串左侧,基线y默认在字符串下方)。
public void drawText (String text, float x, float y, Paint paint)
public void drawText (String text, int start, int end, float x, float y, Paint paint)
public void drawText (CharSequence text, int start, int end, float x, float y, Paint paint)
public void drawText (char[] text, int index, int count, float x, float y, Paint paint)
// 第二类可以分别指定每个文字的位置。
public void drawPosText (String text, float[] pos, Paint paint)
public void drawPosText (char[] text, int index, int count, float[] pos, Paint paint)
// 第三类指定一个路径,根据路径绘制文字。
public void drawTextOnPath (String text, Path path, float hOffset, float vOffset, Paint paint)
public void drawTextOnPath (char[] text, int index, int count, Path path, float hOffset, float vOffset, Paint paint)