需求:在手机屏幕中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.