Android Canvas 缩放(Scale)

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);

1.    publicvoid scale (float sx, float sy) ;

Paint mPaint= new Paint();
canvas.drawColor(Color.BLUE);
mPaint.setColor(Color.GRAY);
canvas.drawRect(new Rect(00400400)mPaint);

// 保存画布状态
canvas.save();
canvas.scale(0.5f0.5f);
mPaint.setColor(Color.YELLOW);
canvas.drawRect(new Rect(00400400)mPaint);
// 画布状态回滚
canvas.restore();

效果就相当于用个钉子钉在(0,0)处,然后把矩形的x,y缩放为一半,如下图所示:


2.    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) 源码如下:

/**
 * Preconcat the current matrix with the specified scale.
 *
 * @param sx The amount to scale in X
 * @param sy The amount to scale in Y
 * @param px The x-coord for the pivot point (unchanged by the scale)
 * @param py The y-coord for the pivot point (unchanged by the scale)
 */
public final void scale(float sx, float sy, float px, float py) {
    translate(px, py);
    scale(sx, sy);
    translate(-px, -py);
}

translate(px,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的效果不同。

 

三. 验证

 
 

1. 先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);


2. 先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);

  • 14
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
Android中的Canvas.scale()方法用于按照指定的比例对画布进行缩放。 这个方法有两个重载版本: 1. `scale(float sx, float sy)`:按照给定的比例sx和sy进行缩放,其中sx和sy表示水平和垂直方向上的缩放比例。例如,`canvas.scale(2.0f, 2.0f)`会使得画布在水平和垂直方向上都放大两倍。 2. `scale(float sx, float sy, float px, float py)`:按照给定的比例sx和sy进行缩放,并且以(px, py)为中心点进行缩放。这个版本的方法可以实现以指定点为中心进行缩放的效果。 需要注意的是,Canvas.scale()方法默认是在画布的原点(0, 0)进行缩放操作。如果需要在其他位置进行缩放,可以通过调整画布的平移操作来实现。 例如,以下代码片段展示了如何使用Canvas.scale()方法对画布进行缩放操作: ```java @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 在画布上绘制一个圆形 Paint paint = new Paint(); paint.setColor(Color.RED); canvas.drawCircle(100, 100, 50, paint); // 缩放画布 canvas.scale(2.0f, 2.0f); // 在缩放后的画布上绘制一个圆形 paint.setColor(Color.BLUE); canvas.drawCircle(100, 100, 50, paint); } ``` 在这个例子中,首先在原始大小的画布上绘制了一个红色的圆形,然后通过调用`canvas.scale(2.0f, 2.0f)`将画布放大了两倍,并在缩放后的画布上绘制了一个蓝色的圆形。 希望这个解答对你有帮助!如果你有任何其他问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值