Canvas是一个画布,我们可以在这个画布上进行各种绘图操作。

Canvas的坐标系
画布以左上角为原点(0,0),向右为X轴的正方向,向下为Y轴的正方向
image.png

Canvas的常用方法

  1. //平移画布。dx,dy为x,y轴上的移动距离
  2. public void translate(float dx, float dy)
  3. //以坐标点(0,0)旋转画布。degress为旋转角度
  4. public void rotate(float degrees)
  5. //以坐标点(px,py)旋转画布。degress为旋转角度
  6. public final void rotate(float degrees, float px, float py)
  7. //以坐标点(0,0)缩放画布。sx,sy为x,y轴上的缩放倍数
  8. public void scale(float sx, float sy)
  9. //以坐标点(px,py)缩放画布。sx,sy为x,y轴上的缩放倍数
  10. public final void scale(float sx, float sy, float px, float py)
  11. //倾斜画布。sx,sy为x,y轴上的倾斜角度的tan值
  12. public void skew(float sx, float sy)

Canvas的绘图操作

Canvas 拥有大量的drawXXX()方法,这些方法用于在画布上绘制各种图形,下面为一些常用的绘图方法:

  1. //绘制颜色
  2. public void drawColor(@ColorInt int color)
  3. public void drawRGB(int r, int g, int b)
  4. public void drawARGB(int a, int r, int g, int b)
  5. //绘制圆
  6. public void drawCircle(float cx, float cy, float radius, @NonNull Paint paint)
  7. //绘制点
  8. public void drawPoint(float x, float y, @NonNull Paint paint)
  9. //绘制多个点
  10. public void drawPoints(@Size(multiple = 2) @NonNull float[] pts, @NonNull Paint paint)
  11. //绘制一条直线
  12. public void drawLine(float startX, float startY, float stopX, float stopY, @NonNull Paint paint)
  13. //绘制多条直线
  14. public void drawLines(@Size(multiple = 4) @NonNull float[] pts, @NonNull Paint paint)
  15. //绘制一个矩形
  16. public void drawRect(@NonNull RectF rect, @NonNull Paint paint)
  17. public void drawRect(@NonNull Rect r, @NonNull Paint paint)
  18. public void drawRect(float left, float top, float right, float bottom, @NonNull Paint paint)
  19. //绘制一个圆角矩形
  20. public void drawRoundRect(@NonNull RectF rect, float rx, float ry, @NonNull Paint paint)
  21. public void drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, @NonNull Paint paint)
  22. //绘制一个椭圆
  23. public void drawOval(@NonNull RectF oval, @NonNull Paint paint)
  24. public void drawOval(float left, float top, float right, float bottom, @NonNull Paint paint)
  25. //绘制一个弧形
  26. public void drawArc(@NonNull RectF oval, float startAngle, float sweepAngle, boolean useCenter, @NonNull Paint paint)
  27. public void drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, @NonNull Paint paint)
  28. //绘制文本
  29. public void drawText(@NonNull String text, float x, float y, @NonNull Paint paint)
  30. //沿Path路径绘制文本
  31. public void drawTextOnPath(@NonNull String text, @NonNull Path path, float hOffset, float vOffset, @NonNull Paint paint)
  32. //绘制位图
  33. public void drawBitmap(@NonNull Bitmap bitmap, float left, float top, @Nullable Paint paint)
  34. public void drawBitmap(@NonNull Bitmap bitmap, @Nullable Rect src, @NonNull RectF dst, @Nullable Paint paint)

  1. import android.content.Context;
  2. import android.graphics.Bitmap;
  3. import android.graphics.BitmapFactory;
  4. import android.graphics.Canvas;
  5. import android.graphics.Color;
  6. import android.graphics.Matrix;
  7. import android.graphics.Paint;
  8. import android.graphics.PorterDuff;

大部分2D使用的api都在android.graphics和android.graphics.drawable包中。他们提供了图形处理相关的: Canvas、ColorFilter、Point(点)和RetcF(矩形)等,还有一些动画相关的:AnimationDrawable、 BitmapDrawable和TransitionDrawable等。以图形处理来说,我们最常用到的就是在一个View上画一些图片、形状或者自定义的文本内容,这里我们都是使用Canvas来实现的。你可以获取View中的Canvas对象,绘制一些自定义形状,然后调用View. invalidate方法让View重新刷新,然后绘制一个新的形状,这样达到2D动画效果。

Paint

要绘图,首先得调整画笔,待画笔调整好之后,再将图像绘制到画布上,这样才可以显示在手机屏幕上。Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进行设置,主要方法如下:

:::success setAntiAlias: 设置画笔的锯齿效果。
setColor: 设置画笔颜色
setARGB: 设置画笔的a,r,p,g值。
setAlpha: 设置Alpha值
setTextSize: 设置字体尺寸。
setStyle: 设置画笔风格,空心或者实心。
setStrokeWidth: 设置空心的边框宽度。
getColor: 得到画笔的颜色
getAlpha: 得到画笔的Alpha值。 :::

例子

绘制一条线

添加ImageView

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. tools:context=".MainActivity">
  8. <ImageView
  9. android:id="@+id/imageView"
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. android:layout_centerInParent="true" />
  13. </androidx.constraintlayout.widget.ConstraintLayout>

src/MainActivity.kt

  1. import android.graphics.Bitmap
  2. import android.graphics.Canvas
  3. import android.graphics.Color
  4. import android.graphics.Paint
  5. import androidx.appcompat.app.AppCompatActivity
  6. import android.os.Bundle
  7. // Import
  8. import android.view.View
  9. import android.widget.ImageView
  10. class MainActivity : AppCompatActivity() {
  11. override fun onCreate(savedInstanceState: Bundle?) {
  12. super.onCreate(savedInstanceState)
  13. setContentView(R.layout.activity_main)
  14. // Main
  15. var imageView: ImageView = findViewById(R.id.imageView)
  16. val bitmap: Bitmap = Bitmap.createBitmap(300, 300, Bitmap.Config.ARGB_8888)
  17. val canvas: Canvas = Canvas(bitmap)
  18. val paint: Paint = Paint()
  19. canvas.drawColor(Color.BLUE)
  20. paint.color = Color.RED
  21. paint.style = Paint.Style.STROKE
  22. paint.strokeWidth = 16F
  23. paint.isAntiAlias = true
  24. canvas.drawLine(0.0F, 0.0F, 100F, 100F, paint)
  25. imageView.setImageBitmap(bitmap)
  26. }
  27. }

image.png