Android 绘图之Canvas

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

如何获得一个Canvas对象
在Android中,想要获得一个Canvas对象主要有三种方法。
1.继承一个View,并重写onDraw()方法。View的Canvas对象会被当做参数传递过来,我们在这个Canvas上进行的操作会直接反映在View中。
2.调用SurfaceHolder.lockCanvas()返回一个Canvas对象。
3.通过构造方法自己创建一个Canvas对象。

val bitmap = Bitmap.createBitmap(100f, 100f, Config.ARGB_8888)
val canvas = Canvas(bitmap)

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

Canvas的常用方法
一.对整个Canvas坐标系的操作

//平移画布。dx,dy为x,y轴上的移动距离
public void translate(float dx, float dy)

//以坐标点(0,0)旋转画布。degress为旋转角度
public void rotate(float degrees)
//以坐标点(px,py)旋转画布。degress为旋转角度
public final void rotate(float degrees, float px, float py)

//以坐标点(0,0)缩放画布。sx,sy为x,y轴上的缩放倍数
public void scale(float sx, float sy)
//以坐标点(px,py)缩放画布。sx,sy为x,y轴上的缩放倍数
public final void scale(float sx, float sy, float px, float py)

//倾斜画布。sx,sy为x,y轴上的倾斜角度的tan值
public void skew(float sx, float sy)

二.Canvas状态的保存与恢复
Canvas在进行上面的平移,缩放,旋转,倾斜后。画布的状态也就随之改变。这可能对我们后面的绘图操作产生很多麻烦。比如我们为了某些效果不得不对画布进行一些操作,但操作完了,画布状态也就改变了。如果我们能对画布的大小和状态进行实时的保存和恢复就好了。Canvas提供了save()和restore()来进行画布状态的保存与恢复。

//每次调用该方法,都会把当前画布的状态进行保存,并存放在一个栈结构中
public int save()

//每次调用该方法,都会把栈中最顶层的画布状态取出来,并按照这个画布状态恢复当前画布。如果当前栈中没有保存的画布状态,则会抛出异常
public void restore()

canvas还提供了一个restoreToCount(int saveCount) 来恢复画布状态。每次调用save()方法保存画布状态时都会返回一个Int型的值。我们可以把该值直接传入restoreToCount()方法中直接恢复画布状态。状态恢复后。会将该状态和该状态顶部的其他画布状态一同出栈。

//恢复指定的画布状态
public void restoreToCount(int saveCount)

三.Canvas图层layer
Canvas添加了对图层的支持,缺省的情况下可以看做只有一个图层
调用saveLayer()可以为canvas创建一个新的图层,在新的图层上的绘制并不会直接绘制在屏幕上,而是在restore()后绘制在上一个图层或者绘制在屏幕上(如果没有上一个图层)。创建一个新图层的好处之一是我们在处理xformode的时候,原图层上的图片和背景都会影响dst和src的合成。这时使用一个新图层是一个很好的选择。

//创建一个指定大小的图层
public int saveLayer(@Nullable RectF bounds, @Nullable Paint paint)
public int saveLayer(float left, float top, float right, float bottom, @Nullable Paint paint)

Canvas还提供了另外两个方法用于创建指定透明度的图层,在该图层上的绘制的图形都会带有指定的透明度。

//创建一个指定大小和透明度的图层。参数alpha为透明度,取值为0到255
public int saveLayerAlpha(@Nullable RectF bounds, int alpha)
public int saveLayerAlpha(float left, float top, float right, float bottom, int alpha)

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

//绘制颜色
public void drawColor(@ColorInt int color)
public void drawRGB(int r, int g, int b)
public void drawARGB(int a, int r, int g, int b)

//绘制圆
public void drawCircle(float cx, float cy, float radius, @NonNull Paint paint)

//绘制点
public void drawPoint(float x, float y, @NonNull Paint paint)
//绘制多个点
public void drawPoints(@Size(multiple = 2) @NonNull float[] pts, @NonNull Paint paint)

//绘制一条直线
public void drawLine(float startX, float startY, float stopX, float stopY, @NonNull Paint paint)
//绘制多条直线
public void drawLines(@Size(multiple = 4) @NonNull float[] pts, @NonNull Paint paint)

//绘制一个矩形
public void drawRect(@NonNull RectF rect, @NonNull Paint paint)
public void drawRect(@NonNull Rect r, @NonNull Paint paint)
public void drawRect(float left, float top, float right, float bottom, @NonNull Paint paint)

//绘制一个圆角矩形
public void drawRoundRect(@NonNull RectF rect, float rx, float ry, @NonNull Paint paint)
public void drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, @NonNull Paint paint)

//绘制一个椭圆
public void drawOval(@NonNull RectF oval, @NonNull Paint paint)
public void drawOval(float left, float top, float right, float bottom, @NonNull Paint paint)

//绘制一个弧形
public void drawArc(@NonNull RectF oval, float startAngle, float sweepAngle, boolean useCenter, @NonNull Paint paint)
public void drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, @NonNull Paint paint)

//绘制文本
public void drawText(@NonNull String text, float x, float y, @NonNull Paint paint)
//沿Path路径绘制文本
public void drawTextOnPath(@NonNull String text, @NonNull Path path, float hOffset, float vOffset, @NonNull Paint paint)

//绘制位图
public void drawBitmap(@NonNull Bitmap bitmap, float left, float top, @Nullable Paint paint)
public void drawBitmap(@NonNull Bitmap bitmap, @Nullable Rect src, @NonNull RectF dst, @Nullable Paint paint)

 

 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值