图片的旋转平移

需求:在手机屏幕中A的位置显示一个圆形图片
假定:原图大小如P1所示,按需求缩放后,如图P2所示。

方案1:先缩放,再平移。
在调用Matrix的postScale方法后,P1图上的所有点都会缩放,其中心点也会缩放到P2图的B(b_x, b_y)处,
此时,P2图要在A(a_x, a_y)处显示,故调用postTranslate,平移大小为(a_x - b_x, a_y - b_y)。
注意,postScale和postTranslate:即先整体缩放,再平移。
tips:缩放前后顶点都为原点

matrix.postScale(scale, scale);
matrix.postTranslate(a_x - b_x, a_y - b_y)


方案2:先平移,再整体缩放:此时使用preScale和preTanslate

原图整体平移到P3图处,则左顶点从(0, 0) -> E(e_x, e_y), 
中心点从C(c_x, c_y) -> D(d_x, d_y),平移的距离也是(e_x, e_y).
即(d_x, d_y) -(c_x, c_y) = (e_x, e_y)
故 d_x - c_x = e_x
d_y - c_y = e_y

此时P3图要整体缩放至圆A处,假定圆半径为r,则
E(e_x, e_y)*scale -> (a_x-r, a_y-r),
D(d_x, d_y)*scale -> A(a_x, a_y);

故:
e_x * scale = a_x - r;
e_y * scale = a_y - r;

d_x * scale = a_x;
d_y * scale = a_y;

即 
e_x = (a_x - r)/scale;
e_y = (a_y - r)/scale;

d_x = a_x/scale;
d_y = a_y/scale;

则图片平移的值(e_x, e_y),就是((a_x - r)/scale, (a_r - r)/scale);
也可以是(e_x, e_y) = (d_x - c_x, d_y - c_y),即(a_x/scale - c_x, a_y/scale - c_y)


matrix.preScale(scale, scale);
matrix.preTranslate((a_x - r)/scale, (a_r - r)/scale)

matrix.preScale(scale, scale);
matrix.preTranslate(a_x/scale - c_x, a_y/scale - c_y)

建议使用方案1.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值