先定义一下画笔

然后学习平移操作

translate(sx,sy) ,

画布沿着X轴方向和y轴方向进行平移

缩放操作

scale(sx,sy) ,画布沿着x轴方向和y轴方向进行比例缩放   ,

scale(sx,sy,translateX,translateY)

这个方法执行了3行代码

translate(px, py);
scale(sx, sy);
translate(-px, -py);

练习代码如下

drawRect(200f,200f,400f,400f ,mPaint)
 //            先translate (px,py),再scale(sx,sy) 再反向translate
             scale(0.6f,0.6f,200f,200f)

              画布右移200 下移200   然后画布缩小0.6f
              再左移200*0.6  上移200*0.6
              也就是80,80位置
              然后画的时候的起点是200*.6  200*0.6 所以 相加之后起点是80+120,80+120
              矩形缩放大小是0.6
              */            mPaint.color=Color.GRAY
             drawRect(200f,200f,400f,400f,mPaint)

旋转操作

练习代码如下

//       3.旋转操作
//            canvas?.run {
//                drawRect(0f,0f,300f,300f ,mPaint)
//                rotate(45f)//如果不指定旋转的点  就默认起始点坐标
//
//                rotate(45f,150f,150f)//px px 表示旋转的中心点坐标
//
//                mPaint.color=Color.GRAY
//                drawRect(0f,0f,300f,300f ,mPaint)
//            }

切割操作

练习代码如下

canvas?.run {
//            drawRect(200f,200f,700f,700f,mPaint)
//            mPaint.color=Color.GRAY
//            drawRect(200f,800f ,700f,1300f,mPaint)
//            clipRect(200f,200f,700f,700f)//裁剪了之后,想要再画图形 只有裁剪区域内的图形可以被显示
//            clipOutRect(200f,200f,700f,700f)//裁剪了之后,想要再画图形 只有裁剪区域内的图形以外的区域可以被显示
//            drawCircle(300f,300f,100f,mPaint)
//            drawCircle(100f,100f,100f,mPaint)
//
//
//        }

矩阵用法

练习代码如下

val matrix = Matrix()
//        matrix.setTranslate(150f,150f)//平移
//        matrix.setRotate(45f)//旋转
//        matrix.setScale(0.5f,.5f)//缩放
//        canvas?.run {
//            drawRect(0f,00f,700f,700f,mPaint)
//            setMatrix(matrix)
//            mPaint.color=Color.GRAY
//
//            drawRect(000f,0f,700f,700f,mPaint)
//        }

 

save restore saveCount  restoreToCount(saveCount)的用法
 

save 相当于压栈 保留当前画布和画笔属性
   restore 是出栈
   saveCount 获取当前入栈数
   restoreToCount(saveCount1) 跳转到指定的某个save
   当然这个save要实现定义好变量
   restore的最小值是1  如果小于一会报异常
   Underflow in restore - more restores than saves
   val saveLayer = saveLayer(0f, 0f, 700f, 700f, mPaint)//离屏绘制
   restoreToCount(saveLayer)//恢复到画布

练习代码如下

canvas?.run {
//            Log.e("saveCount", "saveCount:$saveCount")
//            drawRect(200f,200f,700f,700f,mPaint)
//            val saveCount1 = save()
//          save()
//            Log.e("saveCount", "saveCount:$saveCount")
//            translate(50f,50f)
//            mPaint.color=Color.GRAY
//            drawRect(200f,200f,700f,700f,mPaint)
//            save()
//            Log.e("saveCount", "saveCount:$saveCount")
//            translate(100f,100f)
//            mPaint.color=Color.BLUE
//            drawRect(200f,200f,700f,700f,mPaint)
//            restore()
//            restoreToCount(saveCount1)
//            drawLine(000f,00f,100f,100f,mPaint)
//            Log.e("saveCount", "saveCount:$saveCount")
//            drawLine(200f,200f,700f,700f,mPaint)
//            restore()
//            Log.e("saveCount", "saveCount:$saveCount")
//            mPaint.color=Color.YELLOW
//            drawLine(200f,200f,700f,700f,mPaint)
//            restore()
            drawRect(0f,0f,100f,100f,mPaint)
            val saveLayer = saveLayer(0f, 0f, 700f, 700f, mPaint)//离屏绘制
            mPaint.color=Color.BLUE
           val matrix= Matrix()
            matrix.setTranslate(100f,100f)
            canvas.matrix=matrix
            drawRect(0f,0f,100f,100f,mPaint)

            restoreToCount(saveLayer)
            mPaint.color=Color.BLACK

            drawRect(200f,200f,400f,400f,mPaint)