自己对这个几个方法,用了好多次了,但对它们的原理概念都还是没仔细理解清楚,真是太菜了。
View和canvas并不是同一个东西,可以这样想象,我们的View是固定的,相当于与一个画板或者画框,画板范围就是View的矩形范围,canvas是画布,我们在画布上画东西,最后呈现到画板也就是View上。一开始View和Canvas的坐标是对齐的,也就是画布的右上角就是画框的右上角,四条边都是对齐的。然后canvas是可以变换的,我们平移canvas dx,dy,然后draw画图,就相当于把画布拖动一段距离,然后作画,作画的时候坐标系是按着画布来的,跟View没有关系。最后,最后画布上的东西按照画布的位置直接映射到View画板上,就是移动了的图像。同样的旋转就相当于把画布上的图转动了,默认原点,也可设置点。 对于缩放,要理解一下,就是画的图以某个点为中心放大或者缩小。

一个小技巧:我们思考这几个变换叠加起来的效果的时候,总是容易按照api的顺序,先思考画布变化之后,图像怎么画上去,有时候很难想,感觉这是Android api先变画布,在作画这种顺序设置的局限吧,应该倒过来想才对,是图像画上去之后,把画布进行变化,这样想起来简单多了。比如下面的例子

(不过要注意的是,canvas的变换是影响后面draw的图,不影响前面画好的的图,也是是canva调用draw的时候,相当于画版就把画取走了,后面的canvas是一张白布。所有的图像在View这个画框上面叠加,画框外的图是看不到的。)

canvas多次变化,比如平移,缩放,旋转,就相当于带着所画的图平移,缩放,旋转
以下内容转载别人的:

protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);

//translate  平移,即改变坐标系原点位置Paint paint = new Paint();
paint.setColor(Color.GREEN);
paint.setStyle(Style.FILL);

// canvas.translate(100, 100);
Rect rect1 = new Rect(0,0,400,220);
canvas.drawRect(rect1, paint);
}


旋转:
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);

Paint paint_green = generatePaint(Color.GREEN, Style.FILL, 5);
Paint paint_red   = generatePaint(Color.RED, Style.STROKE, 5);Rect rect1 = new Rect(300,10,500,100);
canvas.drawRect(rect1, paint_red); //画出原轮廓canvas.rotate(30);//顺时针旋转画布
canvas.drawRect(rect1, paint_green);//画出旋转后的矩形

}

效果图是这样的:
缩放:

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

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)移动的物理距离分别是px和py,经过scale(sx, sy)缩放后再通过translate(-px, -py)位移,移动的物理距离就是-px
    sx和-py*sy。

Android Canvas 平移、缩放、旋转的理解相关推荐

  1. qgraphicsview鼠标移动图片_交互式QGraphicsView(平移/缩放/旋转)-阿里云开发者社区...

    简述 Graphics View提供了一个平台用于大量自定义 2D 图元的管理与交互框架包括一个事件传播架构支持场景 Scene 中的图元 Item 进行精确的双精度交互功能.Item 可以处理键盘事 ...

  2. [Python从零到壹] 三十八.图像处理基础篇之图像几何变换(平移缩放旋转)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  3. android画布旋转,Android Canvas 平移、缩放、旋转的理解

    自己用了很久对这个几个方法,用了好多次了,但对它们的原理概念都还是没仔细理解清楚,真是太菜了. View和canvas并不是同一个东西,可以这样想象,我们的View是固定的,相当于与一个画框,画框范围 ...

  4. 线性代数:矩阵变换图形(三维平移缩放旋转)

    紧接上一篇:http://blog.csdn.net/yinhun2012/article/details/79544205 这篇博文我只是准备对上一篇博文的内容进行扩展,因为上一篇我写完二维xy仿射 ...

  5. Android Canvas.scale缩放

    Android30 Canvas.scale方法 1)方法1 将x轴.y轴进行缩放 public void scale(float sx, float sy) {if (sx == 1.0f & ...

  6. C语言数字图像处理---1.5图像基本变换之平移缩放旋转

    本篇作为新年到来前的最后一篇,提前祝大家新年快乐! 图像几何变换又叫做图像基本变换,主要包括图像平移.图像缩放和图像旋转几个部分,当然还有图像镜像等简单的内容.图像基本变换是图像处理的基本内容,是学习 ...

  7. 变换矩阵_平移 缩放 旋转及统一变换

    1. 位移(translation) 对于一个三维坐标(x, y, z),我们想让它往x轴正方向移动1个单位,往y轴正方向移动1个单位,往z轴正方向移动1个单位,则可以让它加上一个向量(1, 1, 1 ...

  8. iOS图片添加平移/缩放/旋转多个手势

    // // UIImageView+Utils.h // OpenWorkr // // Created by 冰凉的枷锁 on 2017/3/6. // Copyright © 2017年 Eden ...

  9. opengl矩阵变换与平移缩放旋转

    2019独角兽企业重金招聘Python工程师标准>>> 坐标系: 1.右手坐标系 2.左手坐标系 左手坐标系是X轴向右,Y轴向上,Z轴向前,右手坐标系的Z轴正好相反,是指向" ...

最新文章

  1. CSharp关键字----using
  2. 用python画雪花飘落_简单说 JavaScript实现雪花飘落效果
  3. 圆形缓冲区(循环buffer)实现
  4. mysql怎么生成可执行文件_查询mysql数据库的java程序在myeclipse上运行正常,但生成可执行文件后查询不出结果。问题出在哪儿呢?...
  5. 解决pandas apply返回多个值时报错:ValueError: too many values to unpack
  6. 几大 Git 平台仓库被劫,黑客欲勒索比特币
  7. Spring Boot-------JPA——EntityManager构建通用DAO
  8. torch.randn
  9. 吴恩达深度学习——自然语言处理与词嵌入
  10. js 的push 方法
  11. 学生学籍管理系统页面源代码html_学生信息管理系统系统源代码
  12. 【暂时完结】Prescan学习笔记
  13. 简述游戏抽奖机制运用的心理学知识(上)
  14. IT技术分享的一点点总结
  15. 在Excel中批量删除换行符
  16. 金盾高级视频加密系统使用教程与经验分享 (金盾视频加密系统跨平台版)
  17. java实现高清图片剪切
  18. 太可怕了! 五一外出还敢连WiFi?
  19. 方舟手游修改服务器难度,方舟手游中途可以修改难度吗
  20. Android开发xposed,用Android Studio开发Xposed插件项目步骤

热门文章

  1. [18调剂]北方民族大学2018年硕士研究生调剂公告
  2. c语言 数组的抽奖小游戏
  3. 吴恩达深度学习编程题——0402(Keras-Tutorial-Happy House )遇到问题及解决方法
  4. 动态树(LCT)初探
  5. 抖音拍摄脚本怎么写,掌握这几点快速拍摄爆款视频丨国仁网络资讯
  6. excel画图的tips
  7. matplotlib 常用图形绘制与官方文档
  8. 微信指数和其他平台的微指数有什么区别
  9. zynq pl访问ps ddr
  10. bzoj4605: 崂山白花蛇草水 //替罪羊式重构k-d树