• 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 / 2;
              mCenterY = height / 2;
              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效果,只是翻转的效果,其实还有很多其他方面的,比如折叠等。以后会继续介绍,谢谢关注。
    源码下载

  • 相关阅读:
    MT7688 Ubuntu uboot编译报错问题
    Ubuntu安装FTP服务器
    普罗米修斯
    【笔记】redis实现类
    问题记录:'AxesSubplot' object does not support indexing
    matplotlib解决子图重叠问题:plt.tight_layout()
    JavaBean转Json,null值忽略问题
    Lombok @SneakyThrows注解
    SpringBoot整合logback
    [转]SpringBoot 生产中 16 条最佳实践
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/8175858.html
Copyright © 2020-2023  润新知