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(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缩放为一半,如下图所示:

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

Android Canvas 缩放(Scale)相关推荐

  1. android 酷狗demo_Android仿酷狗皮肤预览界面的实现(利用canvas缩放的原理)

    GitHub_ AnJiaoDe/Scale-Master APKdemo_ AnJiaoDe/Scale-Master/blob/master/app/build/outputs/apk/app-d ...

  2. 【绘制】HTML5 Canvas坐标变换——坐标系的平移(translate)、缩放(scale)、旋转(rotate)、镜像。(图文、代码)

    我的处女作<Canvas系列教程>在我的Github上正在连载更新,希望能得到您的关注和支持,让我有更多的动力进行创作. 教程介绍.教程目录等能在README里查阅. 传送门:https: ...

  3. Android Canvas类

    1. Canvas类 Canvas主要用于2D绘图,它提供了很多相应的drawXxx()方法,Canvas的获取方式有三种 重写View的onDraw(Canvas)方法 @Override prot ...

  4. Android Canvas总结

    0x00 前言 在Android开发中,有时产品需求会要我们实现一个复杂的控件,如果控件不是常用的类型,这时候我们不得不写一个自定义的控件来实现. 自定义一个控件,目前一般通过继承View或者Surf ...

  5. Android Canvas类介绍和Android Draw Rect 坐标图示

    当我们调整好画笔之后,现在需要绘制到画布上,这就得用Canvas类了.在Android中既然把Canvas当做画布,那么就可以在画布上绘制我们想要的任何东西.除了在画布上绘制之外,还需要设置一些关于画 ...

  6. android canvas添加文字居中,android Canvas drawText 文字居中

    1首先利用canvas获取画布的宽高, //获取屏幕的宽和高 int width = canvas.getWidth(); int height = canvas.getHeight(); 2获取文字 ...

  7. android 画布控件,Android canvas画图操作之切割画布实现方法(clipRect)

    本文实例讲述了Android canvas画图操作之切割画布实现方法.分享给大家供大家参考,具体如下: android切割画布的历程不算很难,可是理解起来也比较麻烦,这里写一下我的理解 但是不一定正确 ...

  8. CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate)

    在CSS3中,可以利用transform功能来实现文字或图像的旋转.缩放.倾斜.移动这四种类型的变形处理,本文将对此做详细介绍. 一.旋转 rotate 用法:transform: rotate(45 ...

  9. 2D转换之缩放scale(CSS3)

    2D转换之缩放scale(CSS3) <!DOCTYPE html> <html lang="en"><head><meta charse ...

最新文章

  1. Docker的基本使用-Ubuntu18.04
  2. 大脑模拟AI学习策略,这项逼近反向传播的研究登上《自然-神经科学》
  3. 55、组播配置实验之PIM Sparse Mode静态指定RP
  4. linux拨号上网的命令,LINUX下ADSL拨号上网
  5. 不允许对系统目录进行即席更新_还不懂Docker?一个故事安排的明明白白!
  6. 删除-Trustzone-TEE-ATF
  7. java Io流实现图片复制
  8. WSUS注冊表導入,工作組用戶系統更新
  9. boost::gursoy_atun_layout用法的测试程序
  10. linux下 命令 实验,实验一:Linux命令实验
  11. ​对于边界值中有不确定字符串时该怎么处理
  12. java 取商_Java读取word文档,转换为网页
  13. Github上不错的Android开源代码(一)
  14. 【4K录屏】高清录屏及剪辑软件:Bandicam 和 Captura
  15. mt管理器图片在哪个文件夹_MT管理器构造(新手小白教程)-小白文件管理器
  16. 计算机c盘内存怎么转给d盘,C盘空间太大怎么把空间转到D盘或E盘
  17. 支付机构备付金管理过程
  18. 备战下半年秋招,分享蚂蚁Java岗面试题80+
  19. weixuan -小老弟做鸭(函数)
  20. 大数据技术原理与应用 第一篇 大数据基础

热门文章

  1. 2021蓝桥杯省赛b题解
  2. 损失函数(Loss)
  3. Zabbix 3.4配置监控项及监控Linux、Windows客户端
  4. PPI (手机屏幕的PPI 和计算方法)
  5. 一、虚拟化技术发展概述
  6. 华硕笔记本 安装系统
  7. [.NET]CheckBoxList 用法
  8. DevOps-jenkins-流水线优化
  9. 公众号推广裂变引流?微信公众号裂变引流有哪些方式?
  10. CAD看图软件怎么快速进行对图纸的打印?