少年郎,是时候打造自己的第一款狂拽酷炫的3D效果了!
来源:互联网 发布:java oa审批流程开发 编辑:程序博客网 时间:2024/04/28 06:50
背景介绍
Android中有两个Camera类。一个是android.hardware.Camera,用于对设备的摄像头进行操作。另一个是android.graphics.Camera,可用于进行3D变换,然后把变换后的矩阵Matrix作用于Canvas等,我们本篇要介绍的就是这个Camera类。
玩转Camera
前面我们提到过,Camera是一个能够进行3D变化的类,在进行玩3D变换后,我们能够通过mCamera.getMatrix(Matrix)
把变换矩阵Matrix赋值,然后可以用在Canvas上。或者,你可以直接通过mCamera.applyToCanvas(Canvas)
直接把变换作用到一个Canvas上。
Android中的三维坐标系
Android中的三维坐标轴符合左手坐标系。需要注意,Android中的三维坐标系中的Y轴和二维的是相反的。
Camera默认的位置是在(0, 0, -8)点。
Camera的变换操作
Camera的方法并不多,所以使用起来也是比较简单明了的。
Camera的使用实例
由于使用Camera的核心就是获得一个变换后的Matrix,所以你需要对Matrix具有一定的认识。关于Matrix的入门级使用,可以参考一下我的这两篇博客。
Android——Matrix变换矩阵的探索(1);
Android——Matrix变换矩阵的探索(2)
演示Demo1
下面是github源码的链接:
Github源码链接
3D ViewGroup演示
Github源码链接
Camera用于自定义动画
直接上个代码实例,用法和前面的例子没什么本质区别,都是通过Camera变换之后获得Matrix矩阵。
public class Custom3DAnimation extends Animation { private Camera mCamera; private int centerWidth; private int centerHeight; public void setmRotateY(float mRotateY) { this.mRotateY = mRotateY; } private float mRotateY; public Custom3DAnimation() { mCamera = new Camera(); mRotateY = 90; } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { Matrix matrix = t.getMatrix(); //获得Transformation的Matrix mCamera.save();//保存当前镜头状态 mCamera.rotateY(mRotateY * interpolatedTime); //使相机旋转 mCamera.getMatrix(matrix); //将旋转变换作用到matrix上 mCamera.restore(); //合并镜头层 matrix.preTranslate(centerWidth, centerHeight);//操作前平移 matrix.postTranslate(-centerWidth, -centerHeight); //操作后平移 } @Override public void initialize(int width, int height, int parentWidth, int parentHeight) { super.initialize(width, height, parentWidth, parentHeight); setDuration(5 * 1000); //设置默认持续时间 setFillAfter(true); //设置动画结束后是否保持状态 setInterpolator(new LinearInterpolator()); //设置插值器 centerWidth = width / 2; centerHeight = height / 2; }}
总结
Camera的使用其实并不复杂,只需要记住前面提到的几个方法就行。由于Camera最终是输出一个矩阵,所以还需要对矩阵有一定的掌握。上面我已经给出了矩阵快速使用的指南,大家可以根据情况自行参考。
如果你觉得还不错,那就动动小捶捶敲个关注、点个赞哦��!
- 少年郎,是时候打造自己的第一款狂拽酷炫的3D效果了!
- 少年,是时候换种更优雅的方式部署你的php代码了
- 终于发布自己的第一款软件了!!!
- 是时候该考虑自己的生活方式了
- 是时候给自己更多的压力生活了
- 是时候要有自己的技术博客了
- 硅谷是时候放下自己的傲慢了
- 是时候学些养活自己的技术了
- 是时候搭建起自己的云盘服务了
- 是时候写个自己的网站了!!
- 打造一款属于自己的Android滑动器
- 用webgl打造自己的3D迷宫游戏
- App打造自定义的统计SDK, 是时候和友盟说分手了
- App打造自定义的统计SDK, 是时候和友盟说分手了
- [Android基础知识]打造自己的动画效果
- 工作几个月了,是时候对自己的技术来个总结了!
- SPB Shell 3D:打造最酷3D效果的Android界面
- 少年,当你谈论飞翔的时候
- 微信小程序详解
- 常用的客观效果指标和测试方法
- hibernate之多对多
- pycharm快捷键、常用设置、配置管理
- C++中的字符串的输入输出函数、空字符与空格的区别、字符变量赋值和字符串初始化
- 少年郎,是时候打造自己的第一款狂拽酷炫的3D效果了!
- 4.3 leetcode -3 binary-tree-level-order-traversal
- 反射机制
- Execution failed for task ':app:mergeDebugResources'
- 一键重装系统可靠吗?快启动一键重装怎么样?
- form表单转成json个数数据
- Java基础面试
- 天天学Linux命令4--pwd命令
- c++-虚函数与纯虚函数