Android Camera 3D效果
一、概念
在Android中要想实现3D效果,第一个想到的应该就是OpenGL ES,因为在很多基础教材中几乎都提到了它。但是其使用起来还是稍微麻烦一些,而且它也主要用在游戏方面,那在应用方面有没有更好的选择呢?答案是肯定的,使用Camera类就可以完成3D效果。它有旋转、平移的一系列方法,实际上都是在改变一个Matrix对象,一系列操作完毕之后,我们得到这个Matrix,然后画我们的物体,就可以了。实际上内部机制还是opengl,不过大大简化了使用。
这么说可能有些朋友会有疑问,Camera不是相机方面的么,其实看完下面的图片就明白了。
不错,Camera在hardware包里面是负责相机方面的;在graphics包里面是图形方面的,不要混淆了。因此接下来主要说一下后者的一些用法,Camera用来计算3D转换、生成矩阵,然后应用在画布上。它的构造方法只有一个不带参数的Camera(),用于实例化一个带有空的转换的Camera。 Camera的坐标系是左手坐标系。如下图所示:
vc/J2aOstvjH0tKytryxyL3PyN3S18DtveKjrLWryse2vLHIvc+zo9PDo7ogIDxpbWcgc3JjPQ=="https://www.2cto.com/uploadfile/Collfiles/20140415/2014041509410378.jpg" alt="\" /> 接下来说一下各个方法的用法:。1、applyToCanvas(Canvas canvas) 根据当前的变换计算出相应的矩阵,然后应用到制定的画布上去,注意是由画布来设置矩阵的。
2、rotateX(float degree) 绕着x轴旋转degree个度数
3、rotateY(float degree) 绕着y轴旋转degree个度数
4、rotateZ(float degree) 绕着z轴旋转degree个度数
5、translate(float x,float y,float z) 在x、y、z坐标轴上执行变换操作
6、save()和restore() 保存原状态,操作完之后,恢复到原状态
除此之外,还要有一个类来配合Camera来使用,那就是Matrix。Matrix用于处理三维的矩阵坐标变换,也常用于图片的处理。Matrix提供了translate(平移)、rotate(旋转)、scale(缩放)、skew(倾斜)四种操作,这四种操作的内部实现过程都是通过matrix.setValues(…)来设置矩阵的值来达到变换图片的效果。Matrix的每种操作都有set、pre、post三种操作,set是清空队列再添加,pre是在队列最前面插入,post是在队列最后面插入。除了translate,其他三种操作都可以指定中心点。
二、实例 1、翻转 比如要实现一个图片翻转的效果,可以这样来写:
import android.graphics.Camera;
import android.graphics.Matrix;
import android.view.animation.Animation;
import android.view.animation.Transformation; public class Rotate3DAnimation extends Animation {
// 3d rotate
private float mFromDegrees;
private float mToDegrees;
private float mCenterX;
private float mCenterY; private Camera mCamera; public Rotate3DAnimation(float fromDegrees, float toDegrees)
{
mFromDegrees = fromDegrees;
mToDegrees = toDegrees;
} @Override
public void initialize(int width, int height, int parentWidth,
int parentHeight)
{
super.initialize(width, height, parentWidth, parentHeight);
mCenterX = width / ;
mCenterY = height / ;
mCamera = new Camera();
} @Override
protected void applyTransformation(float interpolatedTime, Transformation t)
{ final float fromDegrees = mFromDegrees;
float degrees = fromDegrees + (mToDegrees - mFromDegrees) * interpolatedTime; final Matrix matrix = t.getMatrix(); mCamera.save(); mCamera.rotateY(degrees);
mCamera.getMatrix(matrix);
mCamera.restore();
//
matrix.preTranslate(-mCenterX, -mCenterY);
matrix.postTranslate(mCenterX, mCenterY);
}
}
看代码,首先重载了initialize()方法,在里面初始化中间坐标mCenterX、mCenterY 以及实例化Camera对象,initialize()是一个回调函数告诉Animation目标View的大小参数,在这里可以初始化一些相关的参数,例如设置动画持续时间、设置Interpolator、设置动画的参考点等。applyTransformation (float interpolatedTime, Transformation t)函数来实现自定义动画效果,在绘制动画的过程中会反复的调用applyTransformation 函数。通过参数Transformation 来获取变换的矩阵(matrix),final Matrix matrix = t.getMatrix(),通过改变矩阵就可以实现各种复杂的效果。Camera类是用来实现绕Y轴旋转后透视投影的,首先通过t.getMatrix()取得当前的矩阵,然后camera.rotateY对矩阵进行旋转。preTranslate函数是在旋转前移动而postTranslate是在旋转完成后移动,主要作用是让对象围绕自己的中心二旋转。
三、总结 可以看到,要想实现3D效果,还要借助Animation类的配合,因为这个类正是动画类,提供了对象变换的平台。在Android apidemo中也有一个3D效果的程序,类名叫Rotate3dAnimation ,上面的代码真是这个Rotate3dAnimation的简化版本。本文介绍的3D效果,只是翻转的效果,其实还有很多其他方面的,比如折叠等。以后会继续介绍,谢谢关注。
源码下载
Android Camera 3D效果的更多相关文章
- android自己定义ViewPager之——3D效果应用
今天在github里看到一个3D效果的ViewPager,感觉做出来的ViewPager滑动的时候效果十分的炫,就check out下来研究了一下怎样实现的.以及怎样使用.将整个ViewPager稍加 ...
- Matrix和Camera配合实现3D效果
一.Camera与Matrix简单介绍 1.Camera Android中一共有两个Camera,分别为:android.graphics.Camera android.hardware.Camera ...
- android实现3D Gallery 轮播效果,触摸时停止轮播
1.轮播控件涉及到的两个类 CarouselViewPager.java public class CarouselViewPager extends ViewPager { @IntDef({RES ...
- 60.自己定义View练习(五)高仿小米时钟 - 使用Camera和Matrix实现3D效果
*本篇文章已授权微信公众号 guolin_blog (郭霖)独家公布 本文出自:猴菇先生的博客 http://blog.csdn.net/qq_31715429/article/details/546 ...
- 【转】android camera(一):camera模组CMM介绍
关键词:android camera CMM 模组 camera参数平台信息:内核:linux系统:android 平台:S5PV310(samsung exynos 4210) 作者:xubin ...
- android camera(一):camera模组CMM介绍【转】
转自:https://blog.csdn.net/kevinx_xu/article/details/8821818 androidcmm图像处理工作手机三星 关键词:android camera ...
- Android改进版CoverFlow效果控件
最近研究了一下如何在Android上实现CoverFlow效果的控件,其实早在2010年,就有Neil Davies开发并开源出了这个控件,Neil大神的这篇博客地址http://www.inter- ...
- Android 一个3D相册源码
我们专业课有Android的学习,最后老师让做一个简单的Android应用程序.我在网上找些资料,加上自己改造一下做了一个3D相册. 程序仿照Android的相册功能,调用Gallery类对相片进行浏 ...
- 【Android】Android Camera原始帧格式转换 —— 获取Camera图像(一)
概述: 做过Android Camera图像采集和处理的朋友们应该都知道,Android手机相机采集的原始帧(RawFrame)默认是横屏格式的,而官方API有没有提供一个设置Camera采集图像的 ...
随机推荐
- label显示不同颜色的字体
NSString *contentSrt = [NSString stringWithFormat:@"%@ (%@)",categoryModel.categoryName, c ...
- Cocos2dx使用ios内支付IAP具体流程-白白
今天总结了一下cocos2d-x使用ios内支付iap的具体流程,封装好了调用接口,代码与具体说明在此 http://download.csdn.net/detail/u010229677/81566 ...
- 关于Windows 8使用WMP播放音乐时WUDFHost跑CPU和硬盘的问题解决
Windows 8使用Windows Media Player播放音乐的时候.事实上有一个这种情况,WMP和某个什么名字看起来非常屌的进程跑CPU非常高,这个跑非常高视你插入的SD卡内的文件数或者移动 ...
- keepalived + lvs marster 与 backup 之间的 高可用
简介 keepalived 是linux下一个轻量级的高可用解决方案,它与HACMP实现功能类似,都可以实现服务或者网络的高可用,但是又有差别:hacmp是一个专业的.功能完善的高可用软件,它提供了H ...
- spring中编程式事务控制
step1:配置xml文件 <!-- 事务管理bean --> <bean id="transactionManager" class="org.spr ...
- ShadowDOM
HTML5 ShadowDOM & CustomElements KeKeMars 关注 2015.12.09 15:20* 字数 1239 阅读 1626评论 2喜欢 2 Web组件由四部分 ...
- 在Android程序中使用已有的SQLite数据库
已经将这篇文章迁移至 Code问答,你也能够到这里查看这篇文章,请多多关注我的新技术博客CodeWenDa.com 在中文搜索中,没有找到一篇比較好的关于怎样在Android应用中使用自己事先创建好的 ...
- iOS CMSampleBuffer deep copy
extension CVPixelBuffer { func copy() -> CVPixelBuffer { precondition(CFGetTypeID(self) == CVPixe ...
- 对“使用MyEclipse,写的jsp代码因有汉字而无法保存”问题的解决
使用MyEclipse编辑jsp时.有时会出现"使用MyEclipse,写的jsp代码因有汉字而无法保存"的现象,怎样解决呢? Window-->Preferences--& ...
- make常见报错原因分析
1 No rule to make target ‘xxx’ 原因一般是'xxx'文件不存在,首先应该去相应的目录检查文件是否存在.