使用Matrix矩阵进行矩形的绘制,进而属性matrix的使用方式,深入了解matrix的原理。

//1、使用默认的Matrix,绘制默认状态的矩形,宽高都是50像素Rect rect = new Rect(0, 0, 50, 50);//将Matrix矩阵设置给canvas,并绘制矩形canvas.setMatrix(mScaleMatrix);canvas.drawRect(rect,paint);

图-1

//2、平移到屏幕的中心Rect rect = new Rect(0, 0, 50, 50);mScaleMatrix.postTranslate(getWidth()/2,getHeight()/2);//图-2//由于Matrix的原始坐标原点在0,0,所以矩形的左上角与屏幕中心点重合,如果要想矩形的中心与屏幕的中心重合//需要算上矩形的中心坐标,mScaleMatrix.postTranslate(getWidth()/2-25,getHeight()/2-25);//在平移至屏幕中心点后,减去矩形一半的平移量.图-2-1//将Matrix矩阵设置给canvas,并绘制矩形canvas.setMatrix(mScaleMatrix);canvas.drawRect(rect,paint);

图-2

图-2-1

//3、缩放//在默认位置放大2倍Rect rect = new Rect(0, 0, 50, 50);mScaleMatrix.postScale(2,2);//将Matrix矩阵设置给canvas,并绘制矩形canvas.setMatrix(mScaleMatrix);canvas.drawRect(rect,paint);

图-3

//4、平移+缩放//以屏幕中心点为中心放大2倍---错误的做法Rect rect = new Rect(0, 0, 50, 50);mScaleMatrix.postScale(2,2,getWidth()/2,getHeight()/2);Log.i(TAG,mScaleMatrix.toShortString());//[2.0, 0.0, -540.0][0.0, 2.0, -792.0][0.0, 0.0, 1.0]float[] values = new float[9];mScaleMatrix.getValues(values);Log.i(TAG,"X:平移量:"+values[Matrix.MTRANS_X]);Log.i(TAG,"Y:平移量:"+values[Matrix.MTRANS_Y]);Log.i(TAG,"屏幕的高:"+getHeight());Log.i(TAG,"屏幕的宽:"+getWidth());//X:平移量:-540.0//Y:平移量:-792.0//将Matrix矩阵设置给canvas,并绘制矩形canvas.setMatrix(mScaleMatrix);canvas.drawRect(rect,paint);//如图-4,根本看不到那个矩形,原因已经在注释中说明了,上面的代码会导致矩形反向平移出屏幕,所以根本看不到。//正确的做法:先平移,在以平移后的中心点进行缩放,才能达到效果mScaleMatrix.postTranslate(getWidth()/2,getHeight()/2);mScaleMatrix.postScale(2,2,getWidth()/2,getHeight()/2);//图4-1

图-4

图4-1

//5、旋转//以0,0起始坐标点旋转45度Rect rect = new Rect(0, 0, 50, 50);mScaleMatrix.postRotate(45);//将Matrix矩阵设置给canvas,并绘制矩形canvas.setMatrix(mScaleMatrix);canvas.drawRect(rect,paint);//图-5

图-5

//6、平移+旋转//以屏幕中心点,旋转45度Rect rect = new Rect(0, 0, 50, 50);mScaleMatrix.postTranslate(getWidth()/2,getHeight()/2);mScaleMatrix.postRotate(45,getWidth()/2,getHeight()/2);//将Matrix矩阵设置给canvas,并绘制矩形canvas.setMatrix(mScaleMatrix);canvas.drawRect(rect,paint);//图-6

图-6

//7、平移+旋转,看pre 和post的区别,结果都是   图-7
//        //方法一:
//        //以屏幕中心点,旋转45度
//        Rect rect = new Rect(0, 0, 50, 50);
//        mScaleMatrix.postTranslate(getWidth()/2,getHeight()/2);
//        mScaleMatrix.postRotate(45,getWidth()/2,getHeight()/2);//        //方法二:
//        //以屏幕中心点,旋转45度
//        Rect rect = new Rect(0, 0, 50, 50);
//        mScaleMatrix.postRotate(45);
//        mScaleMatrix.postTranslate(getWidth()/2,getHeight()/2);
//        //方法三:
//        //以屏幕中心点,旋转45度
//        Rect rect = new Rect(0, 0, 50, 50);
//        mScaleMatrix.preRotate(45);
//        mScaleMatrix.postTranslate(getWidth()/2,getHeight()/2);//方法四://以屏幕中心点,旋转45度Rect rect = new Rect(0, 0, 50, 50);mScaleMatrix.preRotate(30, getWidth() / 2, getHeight() / 2);Log.i(TAG,mScaleMatrix.toShortString());mScaleMatrix.preTranslate(getWidth() / 2, getHeight() / 2);Log.i(TAG,mScaleMatrix.toShortString());//preXXXX:以pre开头,例如preTranslate postXXXX:以post开头,例如postScale//post-前乘或者叫左乘//pre-后乘或者叫右乘//如果平移和旋转后结果不是预想的,需要注意上述操作的矩阵结果,打印出来一看便知//看源码-以平移为例/*** Preconcats the matrix with the specified translation. M' = M * T(dx, dy)public boolean preTranslate(float dx, float dy) {nPreTranslate(native_instance, dx, dy);return true;}*//*** Postconcats the matrix with the specified translation. M' = T(dx, dy) * Mpublic boolean postTranslate(float dx, float dy) {nPostTranslate(native_instance, dx, dy);return true;}*///将Matrix矩阵设置给canvas,并绘制矩形canvas.setMatrix(mScaleMatrix);canvas.drawRect(rect, paint);

图-7

Matrix矩阵的基础案例与分析相关推荐

  1. 视觉SLAM中,本质矩阵、基础矩阵、单应性矩阵自由度和秩分析

    视觉SLAM中,本质矩阵.基础矩阵.单应性矩阵自由度和秩分析 1.各个矩阵的自由度 由于基础矩阵和本质矩阵都是由对极约束来的 1.1 本质矩阵E的自由度为5,秩为2 1.1.1 自由度: 首先,旋转和 ...

  2. Eigen入门系列 —— Eigen::Matrix矩阵点乘、叉乘、转置、求逆、求和、行列式、迹、数乘

    Eigen入门系列 -- Eigen::Matrix矩阵点乘.叉乘.转置.求逆.求和.行列式.迹.数乘 前言 程序说明 输出结果 代码示例 前言 随着工业自动化.智能化的不断推进,机器视觉(2D/3D ...

  3. 计算机视觉三维重建的几何基础:坐标系与关键矩阵(基础矩阵、本质矩阵、单应矩阵)...

    作者丨李迎松@知乎 来源丨https://zhuanlan.zhihu.com/p/159194599 编辑丨3D视觉工坊 你站在桥上看风景, 看风景人在楼上看你. 明月装饰了你的窗子, 你装饰了别人 ...

  4. 计算机视觉中本质矩阵的概念,【计算机视觉】Lecture 19:本质矩阵和基础矩阵...

    对极几何 左边 极点:相机1所看到的相机2的位置. 右边 极点:相机2所看到的相机1的位置 对极几何 对应点位于共轭极线上 对极几何 给定一幅图像中的一个点,我们如何确定在第二幅图像中要搜索的对应极线 ...

  5. 理解CSS3 transform中的Matrix(矩阵)

    一.哥,我被你吓住了 打架的时候会被块头大的吓住,学习的时候会被奇怪名字吓住(如"拉普拉斯不等式").这与情感化设计本质一致:界面设计好会让人觉得这个软件好用! 所以,当看到上面& ...

  6. 矩阵正态分布基础1 外形式、外积与微分形式简介

    矩阵正态分布基础1 外形式.外积与微分形式简介 外形式 外积 k-微分形式 因为不是讨论微分流形的,所以只是给一些定义方便后续要用的时候查阅:要系统性学习还请参考微分流形的教材. 外形式 定义1.1( ...

  7. TF学习:Tensorflow基础案例、经典案例集合——基于python编程代码的实现

    TF学习:Tensorflow基础案例.经典案例集合--基于python编程代码的实现 目录 Tensorflow的使用入门 1.TF:使用Tensorflow输出一句话 2.TF实现加法 3.TF实 ...

  8. JQuery-学习笔记04【基础——JQuery基础案例】

    Java后端 学习路线 笔记汇总表[黑马程序员] JQuery-学习笔记01[基础--JQuery基础]--[day01] JQuery-学习笔记02[基础--JQuery选择器] JQuery-学习 ...

  9. [Android] 使用Matrix矩阵类对图像进行缩放、旋转、对比度、亮度处理

        前一篇文章讲述了Android拍照.截图.保存并显示在ImageView控件中,该篇文章继续讲述Android图像处理技术,主要操作包括:通过打开相册里的图片,使用Matrix对图像进行缩放. ...

最新文章

  1. MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
  2. Quartz.net 定时任务矿建Demo
  3. 怎样用hibernate验证登陆界面的用户名和密码
  4. Linux 性能监测:Memory
  5. [软件推荐]使用OneNote来构建你自己的知识库(OFFICE2010)
  6. inode与ln命令
  7. HDU 4081 Qin Shi Huang's National Road System
  8. 通过python切换hosts文件
  9. 利用R语言绘制世界航班路线图
  10. Treeview的文件目录配置
  11. python爬虫爬当当网_python爬取当当网图书排行榜
  12. 最新系统分析师考试大纲
  13. 福建省小学四年级上册计算机知识点总结,小学四年级上册数学知识点大全【1-6单元】...
  14. Android 计时器Chronometer 使用及源码分析
  15. 环网交换机的主要作用是什么?
  16. 百度登录界面CSS+HTML
  17. 正则表达式中反斜杠的另一用法
  18. PostgreSQL隐藏列(兼容oracle)
  19. mysql服务重启和关闭
  20. Ubuntu ROS 安装

热门文章

  1. Junction 详细使用方法
  2. 74LS273内部逻辑结构
  3. 工期概率计算_如何从文本和数字单元格值计算工期
  4. OSGI框架:模块层、生命周期层、服务层
  5. jstorm 使用demo
  6. QPlay 协议框架
  7. Flowable高级篇 - Flowable表结构
  8. SAP 物料主数据创建与更改
  9. Java 中的阻塞队列
  10. 在Kali中 利用工具Fluxion渗透wpa/wpa2加密WiFi 详细步骤(小白适用) 2020.1