一、Camera与Matrix简单介绍

1.Camera

Android中一共有两个Camera,分别为:
android.graphics.Camera
android.hardware.Camera
今天我们要说的是第一个Camera,第二个主要应用在相机开发中。

官方介绍:

A camera instance can be used to compute 3D transformations and generate a matrix that can be applied, for instance, on a Canvas.

一个照相机实例可以被用于计算3D变换,生成一个可以被使用的Matrix矩阵,一个实例,用在画布上。

常用方法:

Camera() 创建一个没有任何转换效果的新的Camera实例
applyToCanvas(Canvas canvas) 根据当前的变换计算出相应的矩阵,然后应用到制定的画布上
getLocationX() 获取Camera的x坐标
getLocationY() 获取Camera的y坐标
getLocationZ() 获取Camera的z坐标
getMatrix(Matrix matrix) 获取转换效果后的Matrix对象
restore() 恢复保存的状态
rotate(float x, float y, float z) 沿X、Y、Z坐标进行旋转
rotateX(float deg)
rotateY(float deg)
rotateZ(float deg)
save() 保存状态
setLocation(float x, float y, float z)
translate(float x, float y, float z)沿X、Y、Z轴进行平移

坐标说明:

Camera坐标系研究 
Camera的坐标系是左手坐标系。当手机平整的放在桌面上,X轴是手机的水平方向,Y轴是手机的竖直方向,Z轴是垂直于手机向里的那个方向。

camera位于坐标点(0,0),也就是视图的左上角;

2.Matrix

它是Android提供的一个矩阵工具类,是一个3x3的矩阵,一般要实现2D的旋转(绕z轴旋转)、缩放、平移、倾斜用这个作用于画布,这四种操作的内部实现过程都是通过matrix.setValues(…)来设置矩阵的值来达到变换的效果。

常用方法

setTranslate(float dx,float dy):控制Matrix进行平移
setSkew(float kx,float ky,float px,float py):控制Matrix以px,py为轴心进行倾斜,kx,ky为X,Y方向上的倾斜距离
setRotate(float degress):控制Matrix进行旋转,degress控制旋转的角度
setRorate(float degress,float px,float py):设置以px,py为轴心进行旋转,degress控制旋转角度
setScale(float sx,float sy):设置Matrix进行缩放,sx,sy控制X,Y方向上的缩放比例
setScale(float sx,float sy,float px,float py):设置Matrix以px,py为轴心进行缩放,sx,sy控制X,Y方向上的缩放比例

API提供了set、post和pre三种操作

post是后乘,当前的矩阵乘以参数给出的矩阵。可以连续多次使用post,来完成所需的整个变换。
pre是前乘,参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的。

二、Camera与Matrix旋转效果配合使用

1.camera.translate(10,50,-180)的意思是把观察物体右移(+x)10,上移(+z)50,向-z轴移180(即让物体接近camera,这样物体将会变大);

        //原图
canvas.drawBitmap(bitmap,100,0,paint);
//分割线
canvas.drawLine(0,310,getWidth(),313,paint); //1.将bitmap右移10,上移50,z轴移-180(正值:表示接近camera 变大 正值:表示远离camera 变小)
//x:向右表示正 y:向下表示正 z:向里表示正
matrix.reset();
camera.save();
camera.translate(10,50,-180);
camera.getMatrix(matrix);
camera.restore();
canvas.concat(matrix);
canvas.drawBitmap(bitmap,0,313,paint);

2.图片分别绕x轴,y轴,z轴旋转60度

camera.rotateX(60)的意思是绕X轴顺时针旋转60度。举例来说,如果物体中间线和X轴重合的话,绕X轴顺时针旋转60度就是指物体上半部分向里翻转,下半部分向外翻转;
camera.rotateY(60)的意思是绕Y轴顺时针旋转60度。举例来说,如果物体中间线和Y轴重合的话,绕Y轴顺时针旋转60度就是指物体左半部分向外翻转,右半部分向里翻转;
camera.rotateZ(60)的意思是绕Z轴逆时针旋转60度。举例来说,如果物体中间线和Z轴重合的话,绕Z轴顺时针旋转60度就是物体上半部分向左翻转,下半部分向右翻转。

        //2.将bitmap分别绕x轴,y轴,z轴旋转60
matrix.reset();
camera.save();
// camera.rotateX(60);//绕x轴
// camera.rotateY(60);//绕y轴
camera.rotateZ(60);//绕z轴
camera.getMatrix(matrix);
camera.restore(); //先将旋转中心移动到(0,0)点,因为Matrix总是用0,0点作为旋转点,旋转之后将视图放回原来的位置。
matrix.preTranslate(-getWidth()/2f,-getHeight()/2f);
matrix.postTranslate(getWidth()/2f,getHeight()/2f);
canvas.concat(matrix);
canvas.drawBitmap(bitmap,100,313,paint);

三、代码

1.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"> <com.example.dhj.a3dviewdemo.view.CameraView
android:layout_width="match_parent"
android:layout_height="match_parent" /> </RelativeLayout>

2.view

public class CameraView extends View{
private Matrix matrix;
private Camera camera;
private Paint paint;
private Bitmap bitmap; public CameraView(Context context) {
super(context);
init();
} public CameraView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
} private void init() {
camera=new Camera();
matrix=new Matrix();
paint=new Paint(Paint.ANTI_ALIAS_FLAG);//抗锯齿
paint.setColor(Color.RED);
setBackgroundColor(Color.parseColor("#3f51b5"));//设置一个背景 便于观察
// paint.setStyle(Paint.Style.FILL);
Bitmap srcBitmap= BitmapFactory.decodeResource(getResources(), R.drawable.p5);
bitmap=resizeBitmap(srcBitmap,533,300);
} @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//原图
canvas.drawBitmap(bitmap,100,0,paint);
//分割线
canvas.drawLine(0,310,getWidth(),313,paint); // //1.将bitmap右移10,上移50,z轴移-180(正值:表示接近camera 变大 正值:表示远离camera 变小)
// //x:向右表示正 y:向下表示正 z:向里表示正
// matrix.reset();
// camera.save();
// camera.translate(10,50,-180);
// camera.getMatrix(matrix);
// camera.restore();
// canvas.concat(matrix);
// canvas.drawBitmap(bitmap,0,313,paint); //2.将bitmap分别绕x轴,y轴,z轴旋转60
matrix.reset();
camera.save();
// camera.rotateX(60);//绕x轴
// camera.rotateY(60);//绕y轴
camera.rotateZ(60);//绕z轴
camera.getMatrix(matrix);
camera.restore(); //先将旋转中心移动到(0,0)点,因为Matrix总是用0,0点作为旋转点,旋转之后将视图放回原来的位置。
matrix.preTranslate(-getWidth()/2f,-getHeight()/2f);
matrix.postTranslate(getWidth()/2f,getHeight()/2f);
canvas.concat(matrix);
canvas.drawBitmap(bitmap,100,313,paint); } /**
* 使用Matrix将Bitmap压缩到指定大小
* @param bitmap
* @param w
* @param h
* @return
*/
public Bitmap resizeBitmap(Bitmap bitmap,int w,int h){
int width=bitmap.getWidth();
int height=bitmap.getHeight();
float scaleW=(float) w/width;
float scaleH=(float) h/height;
matrix.postScale(scaleW,scaleH);
Log.e("333", "w:"+w+" h:"+h+" width:"+width+" height:"+height );
Bitmap newBitmap=Bitmap.createBitmap(bitmap,0,0,width,height,matrix,true);
return newBitmap;
} }

参考:Android中利用Camera与Matrix实现3D效果详解

Matrix和Camera配合实现3D效果的更多相关文章

  1. Android中利用Camera与Matrix实现3D效果详解

    本文行文目录: 一.Camera与Matrix初步认识 二.Camera与Matrix旋转效果拆分介绍 三.Camera与Matrix实现立体3D切换效果 [csdn地址:http://blog.cs ...

  2. 60.自己定义View练习(五)高仿小米时钟 - 使用Camera和Matrix实现3D效果

    *本篇文章已授权微信公众号 guolin_blog (郭霖)独家公布 本文出自:猴菇先生的博客 http://blog.csdn.net/qq_31715429/article/details/546 ...

  3. Android Camera 3D效果

    一.概念 在Android中要想实现3D效果,第一个想到的应该就是OpenGL ES,因为在很多基础教材中几乎都提到了它.但是其使用起来还是稍微麻烦一些,而且它也主要用在游戏方面,那在应用方面有没有更 ...

  4. 网页3D效果库Three.js初窥

    网页3D效果库Three.js初窥 背景 一直想研究下web页面的3D效果,最后选择了一个比较的成熟的框架Three.js下手 ThreeJs官网 ThreeJs-github; 接下来我会陆续翻译 ...

  5. android自己定义ViewPager之——3D效果应用

    今天在github里看到一个3D效果的ViewPager,感觉做出来的ViewPager滑动的时候效果十分的炫,就check out下来研究了一下怎样实现的.以及怎样使用.将整个ViewPager稍加 ...

  6. 使用Three.js网页引擎创建酷炫的3D效果的标签墙

    使用Three.js引擎(这是开源的webgl三维引擎,gitgub)进行一个简单应用. 做一个酷炫的3d效果的标签墙(已经放在我的博客首页,大屏幕可见), 去我的博客首页看看实际效果 www.son ...

  7. 3D效果

    3D transform:rotate3d(x,y,z,a) (0.6,1,0.5,45deg) transform-origin 允许改变转换元素的位置,(中心点) transform-style ...

  8. CSS3,3D效果轮播图

    ---恢复内容开始--- 大家还记得我昨天的3D拖拽立方体吗??我昨天还说过css还可以做轮播图,所以咱们今天就写一下,css的轮播图吧! ....这个轮播图主要是用CSS3里的transform的旋 ...

  9. 巧用模糊实现视觉的 3D 效果

    本文较短,将介绍巧用模糊实现视觉 3D 效果的技巧. 我们都知道,在正常的视觉效果中,离我们越近的通常我们会看的越清晰,而离我们较远则相对没那么清晰~ 我们可以利用清晰与模糊两种状态来构建视差效果.像 ...

随机推荐

  1. javascript中原型学习

    学习地址:http://www.cnblogs.com/wangfupeng1988/tag/%E5%8E%9F%E5%9E%8B/

  2. 搭建基于hyperledger fabric的联盟社区(一) --前言

    三个月前上面发了一个关于智群汇聚和问题求解研究的项目,我们公司做其中的一个子项目,就是基于区块链的科技信息联盟构建.利用区块链的去中心化特性,构建一个基于区块链的科技社区,以提供科技群智汇聚采集的基础 ...

  3. C 游戏所要看的书

    C 游戏所要看的书 1.C++primer中文版第4版     经典啊2.C++标准程序库自修教程与参考手册 3.Windows程序设计第5版 4.MFC windows程序设计第2版中文版 5.VC ...

  4. .net中webconfig自定义配置

    在configuration节点,也就是文件的根节点下,增加如下节点 <appSettings> <!--<add key="propPath" value ...

  5. 华为公司内部培训资料_介绍RTSP的消息、信令等

    https://wenku.baidu.com/view/b10415dabd64783e08122b9c.html

  6. 转:Oracle里几组重要的视图--v$sysstat,v$system_event,v$parameter v$system_parameter

    按组分的几组重要的性能视图 1.System 的 over view v$sysstat , v$system_event  , v$parameter,V$instance得到oracle_sid ...

  7. shell命令getopts

    #!/bin/bash set -e cmd="ls" while getopts :a:t:sn opt; do case $opt in a) cmd=$cmd" - ...

  8. C# 通用类型转换方法

    在程序开发过程中经常需要进行数据的类型转换,而且如果一个字段的类型改成另一个类型时,所有相关的类型转换的地方都要跟着修改,不但造成了很多重复转换的代码而且修改字段类型时额外修改相关转换代码的工作量也很 ...

  9. 关于Oracle to_char()函数中的IW,WW 周别显示

    1)ww的算法为每年1月1日为第一周开始,date+6为每一周结尾 例如20050101为第一周的第一天,而第一周的最后一天为20050101+6=20050107 公式 每周第一天 :date + ...

  10. Py修行路 python基础 (二十三)模块与包

    一.模块 1)定义: 模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 2)为何要用模块: 退出python解释器然后重新进入,那之前定义的函数或者变量都将丢失,因 ...