今天记录一个几许改换的核算原理以及两种写法

两种办法

现在先看图

自定义View之几何变换

我们制作两个方块,一个在坐标(100, 100) ,另一个在它向右移动300,向下移动100,再绕中心顺时针旋转15

paint.style = Paint.Style.STROKE
paint.color = Color.RED
paint.strokeWidth = 5f
// 办法一
canvas.drawRect(100f, 100f, 300f, 200f, paint)
canvas.save()
canvas.translate(300f, 100f)
canvas.rotate(15f, 200f, 150f)
canvas.drawRect(100f, 100f, 300f, 200f, paint)
canvas.restore()
// 办法二
canvas.drawRect(100f, 100f, 300f, 200f, paint)
canvas.save()
canvas.rotate(15f, 500f, 250f)
canvas.translate(300f, 100f)
canvas.drawRect(100f, 100f, 300f, 200f, paint)
canvas.restore()

我们能够看到,这儿两种办法便是这两行不一样,其他都一样

// 办法一
canvas.translate(300f, 100f)
canvas.rotate(15f, 200f, 150f)
// 办法二
canvas.rotate(15f, 500f, 250f)
canvas.translate(300f, 100f)

榜首种是先平移,再旋转
第二种是先旋转,再平移

看一下结果

自定义View之几何变换

能够看到,和我们料想的一样

现在来剖析两种写法:

剖析

榜首种

canvas.translate(300f, 100f)
这行是平移,而且平移的是 canvas

canvas.rotate(15f, 200f, 150f) 这个行是旋转,而且旋转的是canvas

也便是这样(绿色为canvas)

先制作 未经过几许改换的矩形

自定义View之几何变换

这是平移

自定义View之几何变换

这是旋转

自定义View之几何变换

最终制作几许改换后的矩形

自定义View之几何变换

能够看到,我们调用 rotate() 办法时,填写的是canvas(绿色)对应的坐标,而不是手机屏幕对应的坐标,也便是说,canvas的移动是会带着canvas的坐标一同移动的,也便是这样

自定义View之几何变换

到这儿应该就明白了,榜首种办法的在rotate() 办法填写的值,是canvas的坐标 而且是先平移,再旋转

第二种

先旋转
canvas.rotate(15f, 500f, 250f)

自定义View之几何变换

然后再平移制作
canvas.translate(300f, 100f)

自定义View之几何变换

两种办法都能够

第二种办法看似笼统,但其实能够想成移动View ,而且坐标全用手机屏幕的坐标,然后倒着写

// 想要先平移再旋转,就倒着写,然后坐标用手机屏幕的坐标
// 比如:canvas坐标 (200, 150),在手机屏幕坐标便是 (500,250),因为你移动了多以要加上移动的像素长度
// 能够想一下,当作先制作 View,然后移动它
canvas.rotate(15f, 500f, 250f)
canvas.translate(300f, 100f)
canvas.draw()