如何将canvas已经绘制出来的内容进行缩放
在缩放后还能够继续进行绘制
谢谢大佬帮助!
canvas的缩放的话,你可以这样,先把想对于原始大小的缩放中心点平移到原点,以这个中心点缩放,然后再把要画的东西,看作是从(0, 0),平移到画布上的绘制目标点,最后绘制就行了。
Canvas 缩放(Scale)
前言:前几天用到Canvas.scale(flostsx, float sy, float px, float py)函数,研究源码后没有看懂,就去网上找资料,发现关于Canvas.scale(flost sx, float sy, float px, float py)的分析很少。经过一天的研究,在此分享一下个人对此的理解,欢迎与各位交流。
本文只介绍Canvas的缩放(scale),关于平移(translate)和旋转(rotate)推荐看以下文章:http://blog.csdn.net/harvic880925/article/details/39080931
一. 缩放(Scale)
Canvas缩放有以下两个方法:
public void scale (float sx, floatsy) ;
public final void scale (float sx,float sy, float px, float py);
Paint mPaint= new Paint();
canvas.drawColor(Color.BLUE);
mPaint.setColor(Color.GRAY);
canvas.drawRect(new Rect(0, 0, 400, 400), mPaint);
// 保存画布状态
canvas.save();
canvas.scale(0.5f, 0.5f);
mPaint.setColor(Color.YELLOW);
canvas.drawRect(new Rect(0, 0, 400, 400), mPaint);
// 画布状态回滚
canvas.restore();
效果就相当于用个钉子钉在(0,0)处,然后把矩形的x,y缩放为一半,如下图所示:
publicfinal void scale (float sx, float sy, float px, float py);
Paint mPaint = new Paint();
canvas.drawColor(Color.BLUE);
mPaint.setColor(Color.GRAY);
canvas.drawRect(new Rect(0, 0, 400, 400), mPaint);
// 保存画布状态
canvas.save();
canvas.scale(0.5f, 0.5f, 200, 200);
mPaint.setColor(Color.RED);
canvas.drawRect(new Rect(0, 0, 400, 400), mPaint);
前两个参数为将画布在x、y方向上缩放的倍数,而px和py 分别为缩放的基准点,如下图所示:
二. 重点来了
Canvas.scale (float sx, float sy, float px, float py) 源码如下:
/**
scale(sx,sy);
translate(-px,-py); …………..I
和
scale(sx,sy); …………..II
不是一样的吗?为什么显示的效果不同?
原因是translate(px, py)移动的物理距离分别是px和py,经过scale(sx, sy)缩放后再通过translate(-px, -py)位移,移动的物理距离就是-px*sx和-py*sy。
我个人的理解是scale(sx, sy)缩放类似于px转换成dp的过程,才会出现I和II的效果不同。
三. 验证
先translate(float fx, float fy)位移,后scale(float sx, float sy)缩放
Paint mPaint = new Paint();
canvas.drawColor(Color.BLUE);
mPaint.setColor(Color.GRAY);
canvas.drawRect(new Rect(0, 0, 400, 400), mPaint);
// 保存画布状态
canvas.save();
canvas.translate(200, 200);
canvas.scale(0.5f, 0.5f);
mPaint.setColor(Color.YELLOW);
canvas.drawRect(new Rect(0, 0, 400, 400), mPaint);
先scale(float sx, float sy)缩放,后translate(float fx, float fy)位移
Paint mPaint = new Paint();
canvas.drawColor(Color.BLUE);
mPaint.setColor(Color.GRAY);
canvas.drawRect(new Rect(0, 0, 400, 400), mPaint);
// 保存画布状态
canvas.save();
canvas.scale(0.5f, 0.5f);
canvas.translate(200, 200);
mPaint.setColor(Color.YELLOW);
canvas.drawRect(new Rect(0, 0, 400, 400), mPaint);
已经画在屏幕上的不是问题呀,先把画布缩放了再画一遍不久好了。如果还有其他操作最好先保存一下画布的状态。
可以对surfaceView缩放。
通过计算缩放率(比如双指捏合,通过计算两指滑动距离计算缩放率),来计算surfaceView的left,top,right,bottom,(比如left = surfaceView.getLeft + 滑动水平距离)
然后调用 surfaceView.layout(left, top, right, bottom);
Matrix matrix = new Matrix();
matrix.postScale(canvas.getWidth()*1.01f/bmpBg.getWidth(), canvas.getHeight()*1.01f/bmpBg.getHeight(), bmpBg.getWidth() / 2, bmpBg.getHeight() / 2);
matrix.postTranslate( (canvas.getWidth()-bmpBg.getWidth()) / 2, (canvas.getHeight()-bmpBg.getHeight()) / 2);
canvas.drawBitmap(bmpBg, matrix, paint);