Android 3D相册实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中原工学院计算机学院
软件平台开发技术
大作业
专业:软件工程
班级:软件121 作品名称: 3D相册
姓名:辛俊闪
学号: 201200834101 指导教师:刘凤华
2015年 6 月 15 日
一、设计目的
奔着让二维的手机照片能够显示出3D的立体效果,让我们的相册更加炫的目的,我初步的想法是开发一个基于android平台的手机相册小应用。
二、作品简介
该应用是基于android开发,将相册置于立体空间中呈现,并且可以通过用手指横向滑动手机屏幕的方式来选择所有浏览的图片,在滑动过程中相册的旋转同时带有惯性因素,使场景效果更自然、更人性化,手指点击一张照片可以进入单独显示对应照片界面,在该界面操作左滑右滑可以切换照片下一张上一张。在浏览完成后,可以按返回键跳转回相册显示。
三、设计思路
3.1 用到的主要技术
本项目开发过程中,用到了OpenGL ES中的图形绘制技术,包括纹理映射技术、物体旋转技术glRotatef()、物体的平移技术glTranslatef(),并且应用到了屏幕触控技术。
3.2 相关技术难点学习
(1)android开发中关于GLSurfaceView简介
SDK 中的android.opengl.GLSurfaceView类提供如下功能:
在OpenGL ES 和View 系统之间建立联系;
使得OpenGL ES 可以工作在Activity 生命周期中;
可选择合适的frame buffer 像素格式;
创建并管理一个单独的渲染线程,可以实现平滑的动画;
提供debugging 工具和API。
GLSurfaceView.Render 接口有三个方法:
onSurfaceCreated():该方法在渲染开始前调用,OpenGL ES 的绘制上下文被重建时也会被调用。当activity 暂停时绘制上下文会丢失,当activity 继续时,绘制上下文会被重建。另外,创建长期存在的OpenGL 资源(如texture)往往也在这里进行。
onSurfaceChanged():当surface 的尺寸发生改变时该方法被调用。往往在这里设置viewport。若你的camera 是固定的,也可以在这里设置camera。
onDrawFrame():每帧都通过该方法进行绘制。绘制时通常先调用glClear函数来清空framebuffer,然后在调用OpenGL ES 的起它的接口进行绘制。
(2)初始化GLSurfaceView
初始化过程其实仅需要你使用setRenderer(Renderer)设置一个渲染(render)。当然,你也
可以修改GLSurfaceView一些默认配置。
* setDebugFlags(int)
* setEGLConfigChooser(boolean)
* setEGLConfigChooser(EGLConfigChooser)
* setEGLConfigChooser(int, int, int, int, int, int)
* setGLWrapper(GLWrapper)
(3)定制android.view.Surface
GLSurfaceView默认会创建像素格式为PixelFormat.RGB_565的surface。如果需要透明效果,调用getHolder().setFormat(PixelFormat.TRANSLUCENT)。透明(TRANSLUCENT)的surface 的像素格式都是32位,每个色彩单元都是8位深度,像素格式是设备相关的,这意味着它可能是ARGB、RGBA或其它。
(4)选择EGL配置
Android设备往往支持多种EGL配置,可以使用不同数目的通道(channel),也可以指定每个通道具有不同数目的位(bits)深度。因此,在渲染器工作之前就应该指定EGL的配置。GLSurfaceView默认EGL配置的像素格式为RGB_656,16位的深度缓存(depth buffer),默认不开启遮罩缓存(stencil buffer)。如果你要选择不同的EGL配置,请使用setEGLConfigChooser 方法中的一种。
(5)调试行为
你可以调用调试方法setDebugFlags(int)或setGLWrapper(GLSurfaceView.GLWrapper)来自定义GLSurfaceView一些行为。在setRenderer方法之前或之后都可以调用调试方法,不过最好是在之前调用,这样它们能立即生效。
(6)设置渲染器
总之,你必须调用setRenderer(GLSurfaceView.Renderer)来注册一个GLSurfaceView.Renderer渲染器。渲染器负责真正的GL渲染工作。
(7)渲染模式
渲染器设定之后,你可以使用setRenderMode(int)指定渲染模式是按需(on demand)还是连续(continuous)。默认是连续渲染。
(8)Activity生命周期
Activity窗口暂停(pause)或恢复(resume)时,GLSurfaceView都会收到通知,此时它的onPause方法和onResume方法应该被调用。这样做是为了让GLSurfaceView暂停或恢复它的渲染线程,以便它及时释放或重建OpenGL的资源。
(9)事件处理
为了处理事件,一般都是继承GLSurfaceView类并重载它的事件方法。但是由于GLSurfaceView是多线程操作,所以需要一些特殊的处理。由于渲染器在独立的渲染线程里,你应该使用Java的跨线程机制跟渲染器通讯。queueEvent(Runnable)方法就是一种相对简单的操作