Android 绘图学习

1 Canvas 基础

Canvas画布,用于绘制出各种形状配合画布的变幻操作可以绘制出很多复杂图形,基本的绘制图形分类。
提供的绘制函数:

canvas.drawColor();canvas.drawRGB();canvas.drawRect();canvas.drawRoundRect();canvas.drawCircle();canvas.drawPath();canvas.drawLine();canvas.drawArc();canvas.drawOval();canvas.drawPoint();canvas.drawPoints();canvas.drawText();canvas.drawTextOnPath();canvas.drawBitmap();会在后面讲:canvas.drawVertices();canvas.drawPicture();canvas.drawBitmapMesh();canvas.drawTextRun();

2 绘制背景,可以用于初始化和清空画布

//绘制颜色,默认模式public void drawColor(@ColorInt int color) {    super.drawColor(color);}//颜色绘制,设置modepublic void drawColor(@ColorInt int color, @NonNull PorterDuff.Mode mode) {    super.drawColor(color, mode);}//参数0-255public void drawARGB(int a, int r, int g, int b) {    super.drawARGB(a, r, g, b);}//参数0-255public void drawRGB(int r, int g, int b) {    super.drawRGB(r, g, b);}

上面四个函数都可以绘制canvas的背景,注意到PorterDuff.Mode变量,它只对两个canvas绘制bitmap起作用,所以此处暂时不讨论mode参数(没有设置mode默认使用srcover porterduff mode)。

canvas.drawColor(Color.BLUE);// canvas.drawColor(Color.GREEN, PorterDuff.Mode.CLEAR);//背景会变成黑色//canvas.drawARGB(150,1,200,57);

3 drawRect 绘制矩形

//传入RectF public void drawRect(@NonNull RectF rect, @NonNull Paint paint) {    super.drawRect(rect, paint);}//传入Rectpublic void drawRect(@NonNull Rect r, @NonNull Paint paint) {    super.drawRect(r, paint);}//把Rect的四个点坐标传入public void drawRect(float left, float top, float right, float bottom, @NonNull Paint paint) {    super.drawRect(left, top, right, bottom, paint);}

Rect 和RectF都是提供一个矩形局域。
(1)精度不一样,Rect是使用int类型作为数值,RectF是使用float类型作为数值。
(2)两个类型提供的方法也不是完全一致。

canvas.drawColor(Color.WHITE);Rect rect1 = new Rect(100, 100, 300, 300);RectF rect2 = new RectF(100, 400, 300, 600);canvas.drawRect(100,700,300,900,mPaint);canvas.drawRect(rect1,mPaint);canvas.drawRect(rect2,mPaint);

4 drawRoundRect :绘制圆角矩形

public void drawRoundRect(@NonNull RectF rect, float rx, float ry, @NonNull Paint paint) {    super.drawRoundRect(rect, rx, ry, paint);}//不利用RectF,直接设置四个点public void drawRoundRect(float left, float top, float right, float bottom, float rx, float ry,        @NonNull Paint paint) {    super.drawRoundRect(left, top, right, bottom, rx, ry, paint);}

**
rect:RectF对象,一个矩形区域。
rx:x方向上的圆角半径。
ry:y方向上的圆角半径。
paint:绘制时所使用的画笔。**

 canvas.drawColor(Color.WHITE);RectF rect2 = new RectF(100, 400, 300, 600); canvas.drawRoundRect(rect2,50,50,mPaint);

5 drawCircle绘制圆形

public void drawCircle(float cx, float cy, float radius, @NonNull Paint paint) {    super.drawCircle(cx, cy, radius, paint);}

**
cx 圆心x
cy 圆心y
radius半径**

canvas.drawColor(Color.WHITE);canvas.drawCircle(400,400,200,mPaint);

6 drawPath:绘制路径

public void drawPath(@NonNull Path path, @NonNull Paint paint) {    super.drawPath(path, paint);}

需要一个Path,代表路径后面会讲解。

Path path = new Path();path.moveTo(200,200);//起点path.lineTo(300,300);path.lineTo(200,600);canvas.drawPath(path,mPaint);

7 drawLine绘制直线

//提供起点,终点和画笔public void drawLine(float startX, float startY, float stopX, float stopY,        @NonNull Paint paint) {    super.drawLine(startX, startY, stopX, stopY, paint);}public void drawLines(@Size(multiple = 4) @NonNull float[] pts, int offset, int count,        @NonNull Paint paint) {    super.drawLines(pts, offset, count, paint);}public void drawLines(@Size(multiple = 4) @NonNull float[] pts, @NonNull Paint paint) {    super.drawLines(pts, paint);}

绘制线的集合,参数中pts是点的集合,两个值代表一个点,四个值代表一条线,互相之间不连接。
offset跳过的点,count跳过之后要绘制的点的总数,可以用于集合中部分点的绘制。

canvas.drawLine(100,100,500,300,mPaint);float[] positions = {20,20,20,35,40,40,50,87,60,70,90,120};canvas.drawLines(positions,mPaint);float[] positions2 = {20,20,20,35,320,320,320,335,340,340,350,387,360,370,390,420,410,200,90,170};canvas.drawLines(positions2,4,12,mPaint);或者canvas.drawLines(positions2,4,16,mPaint);

跳过部分节点:


没有跳过点


8 drawArc() 绘制圆弧

public void drawArc(@NonNull RectF oval, float startAngle, float sweepAngle, boolean useCenter,        @NonNull Paint paint) {    super.drawArc(oval, startAngle, sweepAngle, useCenter, paint);}public void drawArc(float left, float top, float right, float bottom, float startAngle,        float sweepAngle, boolean useCenter, @NonNull Paint paint) {    super.drawArc(left, top, right, bottom, startAngle, sweepAngle, useCenter, paint);}

RectF oval:生成弧的矩形,中心为弧的圆心
float startAngle:弧开始的角度,以X轴正方向为0度,顺时针
float sweepAngle:弧持续的角度
boolean useCenter:是否有弧的两边,True,还两边,False,只有一条弧

RectF rectF1 = new RectF(100, 100, 400, 400);canvas.drawArc(rectF1,0,270,false,mPaint);RectF rectF2 = new RectF(400, 400, 700, 700);canvas.drawArc(rectF2,0,270,true,mPaint);

9 drawOval 绘制椭圆

public void drawOval(@NonNull RectF oval, @NonNull Paint paint) {    super.drawOval(oval, paint);}public void drawOval(float left, float top, float right, float bottom, @NonNull Paint paint) {    super.drawOval(left, top, right, bottom, paint);}

在矩形框内画一个椭圆,如果是个正方形会画出一个圆。

RectF rectF1 = new RectF(200, 200, 400, 400);RectF rectF2 = new RectF(200, 500, 700, 600);canvas.drawOval(rectF1,mPaint);canvas.drawOval(rectF2,mPaint);

10 drawPoint绘制点:

canvas.drawPoint();
canvas.drawPoints();

public void drawPoint(float x, float y, @NonNull Paint paint) {    super.drawPoint(x, y, paint);}public void drawPoints(@Size(multiple = 2) float[] pts, int offset, int count,        @NonNull Paint paint) {    super.drawPoints(pts, offset, count, paint);}public void drawPoints(@Size(multiple = 2) @NonNull float[] pts, @NonNull Paint paint) {    super.drawPoints(pts, paint);}

**
只需要提供两个点一个坐标就可以绘制点。
canvas.drawPoint(20,20,mPaint);
float[] points = {30,40,40,50,60,60};
canvas.drawPoints(points,mPaint);**

11 drawText 绘制文本,drawTextOnPath沿路径绘制文本

public void drawText(@NonNull char[] text, int index, int count, float x, float y,        @NonNull Paint paint) {    super.drawText(text, index, count, x, y, paint);}public void drawText(@NonNull String text, float x, float y, @NonNull Paint paint) {    super.drawText(text, x, y, paint);}public void drawText(@NonNull String text, int start, int end, float x, float y,        @NonNull Paint paint) {    super.drawText(text, start, end, x, y, paint);}public void drawText(@NonNull CharSequence text, int start, int end, float x, float y,        @NonNull Paint paint) {    super.drawText(text, start, end, x, y, paint);}

这几种方法类似:
canvas.drawText("好好学习,天天向上",100,100,mPaint);


canvas.drawText("好好学习,天天向上",100,100,mPaint);Path path = new Path();path.addArc(new RectF(100,100,600,600),0,260);canvas.drawTextOnPath("好好学习,天天向上",path,10,10,mPaint);

drawTextOnPath
沿着一条 Path 来绘制文字
text 为所需要绘制的文字
path 为文字的路径
hOffset 文字相对于路径的水平偏移量,用于调整文字的位置
vOffset 文字相对于路径竖直偏移量,用于调整文字的位置
值得注意的是,在绘制 Path 的时候,应该在拐弯处使用圆角,这样文字显示时更舒服

大致讲解,后面会重点讲解。

12 drawBitmap 绘制bitmap

public void drawBitmap(@NonNull Bitmap bitmap, @Nullable Rect src, @NonNull RectF dst,        @Nullable Paint paint) {    super.drawBitmap(bitmap, src, dst, paint);}public void drawBitmap(@NonNull Bitmap bitmap, @Nullable Rect src, @NonNull Rect dst,        @Nullable Paint paint) {    super.drawBitmap(bitmap, src, dst, paint);}

Rect src
Rect dst
其中src和dst这两个矩形区域是用来做什么的?
Rect src:指定绘制图片的区域
Rect dst或RectF dst:指定图片在屏幕上的绘制(显示)区域
首先指定图片区域,然后指定绘制图片的区域。

 Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher_round);canvas.drawBitmap(bitmap,100,100,mPaint); Rect rect = new Rect(0, 0, 50, 50); Rect rect2 = new Rect(200, 200, 300, 300);canvas.drawBitmap(bitmap,rect,rect2,mPaint);

android绘图之Paint(1)
android绘图之Canvas基础(2)
Android绘图之Path(3)
Android绘图之drawText绘制文本相关(4)
Android绘图之Canvas概念理解(5)
Android绘图之Canvas变换(6)
Android绘图之Canvas状态保存和恢复(7)
Android绘图之PathEffect (8)
Android绘图之LinearGradient线性渐变(9)
Android绘图之SweepGradient(10)
Android绘图之RadialGradient 放射渐变(11)
Android绘制之BitmapShader(12)
Android绘图之ComposeShader,PorterDuff.mode及Xfermode(13)
Android绘图之drawText,getTextBounds,measureText,FontMetrics,基线(14)
Android绘图之贝塞尔曲线简介(15)
Android绘图之PathMeasure(16)
Android 动态修改渐变 GradientDrawable

更多相关文章

  1. Android(安卓)rom开发:最完整的截屏方案(支持全屏截屏+区域截屏)
  2. Android(安卓)Activity返回结果startActivityForResult函数
  3. Android点击EditText之外的地方隐藏键盘
  4. android surfaceview 指哪画哪升级版!
  5. android textview文字换行排…
  6. Android辅助功能AccessibilityService自动全选择文字粘贴模拟输
  7. android 如何用代码生成圆角Bitmap图片
  8. Android(安卓)path.op 和canvas.clipPath使用一例
  9. Android(安卓)自定义字体中英文混合后导致页边距不对的解决方案

随机推荐

  1. android studio wifi连接真机调试
  2. Android Timer使用
  3. 全球支持最多运行平台的NoSQL数据库 iBox
  4. android配置cmake
  5. Android 学习笔记 Contacts (二)Contacts
  6. Android Bitmap 缩放 旋转 水印 裁剪操作
  7. 关于Android studio混淆遇到的问题
  8. android中客服端和服务器端的链接
  9. Android中的界面布局之帧布局,相对布局
  10. Android 动画效果 --Animation 动画专题