自己用了很久对这个几个方法,用了好多次了,但对它们的原理概念都还是没仔细理解清楚,真是太菜了。

View和canvas并不是同一个东西,可以这样想象,我们的View是固定的,相当于与一个画框,画框范围就是View的矩形范围,canvas是画布,透过画框可以看到canvas。一开始View和Canvas是对齐的,也就是画布的右上角就是画框的右上角,四条边都是对齐的,透过画框看到整个画布。然后canvas是可以变换的,我们平移canvas dx,dy,然后draw画图,就相当于把画布拖动一段距离,然后作画,作画的时候坐标系是按着画布来的,跟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)位移,移动的物理距离就是-pxsx和-py*sy。

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

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

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

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

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

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

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

  4. html5 中心点旋转,html5 canvas围绕中心点旋转

    围绕中心点旋转 window.addEventListener('load',eventWindowLoaded,false); function eventWindowLoaded(){ canva ...

  5. android 画布 轨迹,Android 多点触控,绘制滑动轨迹和十字光标

    这个测试项,要捕捉当前有几个触摸点,当前触摸点坐标,滑动事件在x轴.y轴方向的速度等信息,在触摸时跟随触摸点会出现十字光标,绘制出滑动轨迹. 首先绘制出暗色格子背景,采用了自定义View,较为简单,核 ...

  6. android 画布叠加,Android实现图片叠加效果的两种方法

    本文实例讲述了Android实现图片叠加效果的两种方法.分享给大家供大家参考,具体如下: 效果图: 第一种: 第二种: 第一种是通过canvas画出来的效果: public void first(Vi ...

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

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

  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轴正好相反,是指向" ...

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

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

最新文章

  1. 蓝桥杯C++ AB组辅导课
  2. HTML(六)——表单验证、正则表达式、事件
  3. 2013年、2012、2011年中国软件业收入百强名录 看中国软件业这三年的变化
  4. 【题解】luogu p1111 修复公路
  5. Java并发基础02. 传统线程技术中的定时器技术
  6. scrapy框架_入门Scrapy框架看这一篇文章就够了
  7. mysql optimizer_mysql 参数optimizer_switch
  8. react发送和接收请求_React行为编程简介:请求,等待和阻止
  9. lisp正负调换_lisp中如何把符号转换为字符串
  10. java连接池域名切换_java - 使用JDBC的连接池选项:DBCP与C3P0
  11. 给我的Nokia3100
  12. Python:输出系统所有的PID
  13. 如何在IIS添加MIME扩展类型
  14. java中的并发是什么意思_java中的并发是什么
  15. win10系统网卡驱动异常,错误代码56
  16. 在mysql中 使用in关键字实现子查询_MySQL 之子查询
  17. 计算几何之 旋转卡壳 代码模板与证明
  18. onmouseover和onmouseout的烦恼
  19. Mac上安装mysql及密码重置
  20. OkHttp,蚂蚁金服Android架构面试题

热门文章

  1. 自动控制原理[厉玉鸣]7~9章参考答案【第九章】
  2. 为什么 Vue3 的 ref 让很多大佬操碎了心?
  3. 5G切换流程详细介绍
  4. 基于IDEA社区版创造SpringBoot项目
  5. java毕设项目桂林餐饮服务平台(附源码)
  6. github仓库管理(Linux 命令行)
  7. $Ajax构成和请求报错返回值
  8. (原创)Openwrt路由器Post登陆校园网全过程(后续再补)
  9. Python Gui程序 记事本可输入
  10. 性感的数据可视化 —— 精讲桑基图、气泡图、南丁格尔玫瑰图