xlfsummer / mp-painter

声明式地创建适用于 uniapp, 原生微信小程序和原生H5的 canvas 海报

Home Page:https://mp-painter.xlf-summer.cn/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

使用transform与image结合,在图片不进行偏移的情况下没问题,一旦图片偏移了,其旋转基于的圆心点就会计算错误(应该说还在原来的位置)

dafeizhu opened this issue · comments

new Painter(uni.createCanvasContext('canvas-transform-rotate')).draw({
    type: 'transform',
    content: {
       type: 'image',
       left: 100,
       top: 0,
       width: 90,
       height: 90,
       src: 'https://ask.dcloud.net.cn/account/identicon/68a13e9b37dcb8153bf6517414de8d91.png'
    },
    transform: [
       { type: 'rotate', rotate: 0 } // 90
       // { type: 'translate', x: 0, y: 0 }
    ]
})

示例代码如上,这个时候,图片向右位移了100rpx,位置正确,理论上transform基于的圆心也应该位移,这个时候如果做rotate,其旋转会以原圆心,也即是基于(90rpx/2,90rpx/2)去做旋转。
示例图如下:
image
期望情况,图片位移时,图片的圆心能够跟着图片的偏移量移动,或者说有可其他方案能够达成此目的?

我看你的代码中是先 rotatetranslate 的,这样的话你示例图中没有标记正常位置那一个就是正确的
transform 中,先 rotate 时,会改变变换本身的坐标轴,也就是说原本的“右”,旋转之后变为了“下”,
第二步向右 translate 变为了向下translate。这与 CSS 中的 transform 表现一致。

如果想要将图片移动到示例图中正常位置并顺时针旋转 90 度,可以用如下变换:

方法一:

1. translate x: 100
2. rotate 90

方法二:

1. rotate 90
2. translate y: -100

我看你的代码中是先rotatetranslate的,这样的话你示例图中没有标记正常位置那一个就是正确的
transform中,先rotate时,会改变变换本身的坐标轴,从而原本的“右”,旋转之后变为了“下”,
第二步向右translate变为了向下translate。这与CSS中的变换表现一致。

如果想要将图片移动到示例图中正常位置并顺时针旋转90度,可以用如下变换:

方法一:

1. translate x: 100
2. rotate 90

方法二:

1. rotate 90
2. translate y: -100

作者你好,你说的这个方法,就是先translate后rotate,可实际上通过参数一次性传入的话,并没有先后之分,可能你的意思是在外再嵌套一层type:transform然后使用translate。
我这边已经试出了解决方案,其实也就是最外层嵌套一层type:container,然后通过这层做位移;里面再使用type:transform,来做相关的rotate和scale。
谢谢你的解答!