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(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)相关推荐
- android 酷狗demo_Android仿酷狗皮肤预览界面的实现(利用canvas缩放的原理)
GitHub_ AnJiaoDe/Scale-Master APKdemo_ AnJiaoDe/Scale-Master/blob/master/app/build/outputs/apk/app-d ...
- 【绘制】HTML5 Canvas坐标变换——坐标系的平移(translate)、缩放(scale)、旋转(rotate)、镜像。(图文、代码)
我的处女作<Canvas系列教程>在我的Github上正在连载更新,希望能得到您的关注和支持,让我有更多的动力进行创作. 教程介绍.教程目录等能在README里查阅. 传送门:https: ...
- Android Canvas类
1. Canvas类 Canvas主要用于2D绘图,它提供了很多相应的drawXxx()方法,Canvas的获取方式有三种 重写View的onDraw(Canvas)方法 @Override prot ...
- Android Canvas总结
0x00 前言 在Android开发中,有时产品需求会要我们实现一个复杂的控件,如果控件不是常用的类型,这时候我们不得不写一个自定义的控件来实现. 自定义一个控件,目前一般通过继承View或者Surf ...
- Android Canvas类介绍和Android Draw Rect 坐标图示
当我们调整好画笔之后,现在需要绘制到画布上,这就得用Canvas类了.在Android中既然把Canvas当做画布,那么就可以在画布上绘制我们想要的任何东西.除了在画布上绘制之外,还需要设置一些关于画 ...
- android canvas添加文字居中,android Canvas drawText 文字居中
1首先利用canvas获取画布的宽高, //获取屏幕的宽和高 int width = canvas.getWidth(); int height = canvas.getHeight(); 2获取文字 ...
- android 画布控件,Android canvas画图操作之切割画布实现方法(clipRect)
本文实例讲述了Android canvas画图操作之切割画布实现方法.分享给大家供大家参考,具体如下: android切割画布的历程不算很难,可是理解起来也比较麻烦,这里写一下我的理解 但是不一定正确 ...
- CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate)
在CSS3中,可以利用transform功能来实现文字或图像的旋转.缩放.倾斜.移动这四种类型的变形处理,本文将对此做详细介绍. 一.旋转 rotate 用法:transform: rotate(45 ...
- 2D转换之缩放scale(CSS3)
2D转换之缩放scale(CSS3) <!DOCTYPE html> <html lang="en"><head><meta charse ...
最新文章
- Docker的基本使用-Ubuntu18.04
- 大脑模拟AI学习策略,这项逼近反向传播的研究登上《自然-神经科学》
- 55、组播配置实验之PIM Sparse Mode静态指定RP
- linux拨号上网的命令,LINUX下ADSL拨号上网
- 不允许对系统目录进行即席更新_还不懂Docker?一个故事安排的明明白白!
- 删除-Trustzone-TEE-ATF
- java Io流实现图片复制
- WSUS注冊表導入,工作組用戶系統更新
- boost::gursoy_atun_layout用法的测试程序
- linux下 命令 实验,实验一:Linux命令实验
- ​对于边界值中有不确定字符串时该怎么处理
- java 取商_Java读取word文档,转换为网页
- Github上不错的Android开源代码(一)
- 【4K录屏】高清录屏及剪辑软件:Bandicam 和 Captura
- mt管理器图片在哪个文件夹_MT管理器构造(新手小白教程)-小白文件管理器
- 计算机c盘内存怎么转给d盘,C盘空间太大怎么把空间转到D盘或E盘
- 支付机构备付金管理过程
- 备战下半年秋招,分享蚂蚁Java岗面试题80+
- weixuan -小老弟做鸭(函数)
- 大数据技术原理与应用 第一篇 大数据基础