传送门 ☞ Android兵器谱 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229

传送门 ☞ 系统架构设计 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229

传送门 ☞ GoF23种设计模式 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229

使物体依据程序的设定而移动,比如旋转三角形,这对于吸引用户的眼球是极其有效的。你想让OpenGL ES图形与用户交互吗?使用OpenGL ES应用响应触摸的关键是扩展你的GLSurfaceView代码,覆写其onTouchEvent()方法来监听触摸事件。 

        这一节将向你展示如何监听用户的触摸事件,让用户旋转一个OpenGL ES对象。


一、设置一个触摸监听器

        为了使你的OpenGL ES应用能够响应触摸事件,必须在你的GLSurfaceView类中覆写onTouchEvent()方法。下面的示例演示了如何监听MotionEvent.ACTION_MOVE事件和将其转换为一个形状的旋转角度。

@Override
public boolean onTouchEvent(MotionEvent e) {
// MotionEvent携带从触摸屏幕而来的输入细节以及其它输入控制。
// 此处,你只需要关注触摸位置的改变即可。 float x = e.getX();
float y = e.getY(); switch (e.getAction()) {
case MotionEvent.ACTION_MOVE: float dx = x - mPreviousX;
float dy = y - mPreviousY; // 反向旋转中线以上
if (y > getHeight() / 2) {
dx = dx * -1 ;
} // 反向旋转至左中线
if (x < getWidth() / 2) {
dy = dy * -1 ;
} mRenderer.mAngle += (dx + dy) * TOUCH_SCALE_FACTOR; // = 180.0f / 320
requestRender();
} mPreviousX = x;
mPreviousY = y;
return true;
}

请注意,在计算完旋转角度之后,该方法调用requestRender()来告诉renderer需要渲染帧了。这种做法很高效,因为在没有发生旋转时不需要重画帧。然而,在没有使用setRenderMode()方法将渲染模式设置为仅当数据发生改变才重绘之前,是无法达到高效的。所以应该确保解除在上一节中对该行代码的弃用:

public MyGLSurfaceView(Context context) {
...
// 仅当绘制数据发生变化时渲染视图
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}

二、对外暴露旋转角度
        上面的示例代码需要你向程序中的其它类暴露旋转角度,所以应该为你的renderer添加一个public类型成员变量。由于renderer的代码是运行在主界面之外的其他线程中,因此必须声明这个变量为volatile。参照下面的代码:

public class MyGLRenderer implements GLSurfaceView.Renderer {
...
public volatile float mAngle;
}

三、应用旋转
        想要绘制对象响应触摸事件而产生旋转,应该注释掉生成旋转角度的代码并添加mAngle,它标识触摸所生成的角度:

public void onDrawFrame(GL10 gl) {
...
// 为三角形创建一个旋转
// long time = SystemClock.uptimeMillis() % 4000L;
// float angle = 0.090f * ((int) time);
Matrix.setRotateM(mRotationMatrix, 0, mAngle, 0, 0, -1.0f); // 合并旋转矩阵到投影和相机视图矩阵
Matrix.multiplyMM(mMVPMatrix, 0, mRotationMatrix, 0, mMVPMatrix, 0); // 绘制三角形
mTriangle.draw(mMVPMatrix);
}

当你完成了上述步骤,运行程序,在屏幕上划动手指旋转三角形,看起来应该像下面这样:

四、示例源码

点我下载源码 或访问:http://developer.android.com/training/graphics/opengl/index.html

[置顶] 使用Android OpenGL ES 2.0绘图之六:响应触摸事件的更多相关文章

  1. [置顶] 使用Android OpenGL ES 2.0绘图之五:添加运动

    传送门 ☞ 系统架构设计 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 传送门 ☞ GoF23种设计模式 ☞ 转载请注明 ☞ http://blog.csd ...

  2. Android OpenGL ES 3.0 纹理应用

    本文主要演示OpenGL ES 3.0 纹理演示.接口大部分和2.0没什么区别,脚本稍微有了点变化而已. 扩展GLSurfaceView package com.example.gles300; im ...

  3. [工作记录] Android OpenGL ES 2.0: square texture not supported on some device

    npot texture: non-power-of-two texture.rectangle texture: non-square (height != wdith) 在测试Samsumg Ga ...

  4. Android openGL ES 2.0里Surfaceview背景透明

    surfaceview的黑色背景会挡住其父的背景,现在把surfaceview的背景设为透明,既可以看到所绘的3D物体,又可以看到背景. 在onSurfaceCreated里,调用GLES20.glC ...

  5. 基于Cocos2d-x学习OpenGL ES 2.0系列——你的第一个三角形(1)

    前言 在本系列教程中,我会以当下最流行的2D引擎Cocos2d-x为基础,介绍OpenGL ES 2.0的一些基本用法.本系列教程的宗旨是OpenGL扫盲,让大家在使用Cocos2d-x过程中,知其然 ...

  6. [工作记录] Android OpenGL ES: non-square texture - continue

    previous: [工作记录] Android OpenGL ES 2.0: square texture not supported on some device recently I found ...

  7. 利用JNI技术在Android中调用C++形式的OpenGL ES 2.0函数

    1.                 打开Eclipse,File-->New-->Project…-->Android-->AndroidApplication Projec ...

  8. 【Android 应用开发】OpenGL ES 2.0 -- 制作 3D 彩色旋转三角形 - 顶点着色器 片元着色器 使用详解

    最近开始关注OpenGL ES 2.0 这是真正意义上的理解的第一个3D程序 , 从零开始学习 . 案例下载地址 : http://download.csdn.net/detail/han120201 ...

  9. Android OpenGL ES 开发

    OpenGL(Open Graphics Library) 是开放图形库,是一个跨平台的图形 API.OpenGL ES(OpenGL for Embedded System)是专为移动端提供的一个子 ...

随机推荐

  1. 算法如功夫——C++ 用递归函数计算n的阶乘n!

    算法如功夫,套路练久了,才干应用自如! 学功夫不能死练,知其所以然,取长补短! #include <iostream.h> int main(int argc, char* argv[]) ...

  2. 页面中引入js的几种方法

    通常大家最为熟悉的是一下两种方法: 在页面中直接写入<script type="text/javascript">js代码</script>. 在页面中引入 ...

  3. [译]ava 设计模式之构造器

    (文章翻译自Java Design Pattern: Builder) 构造器模式的关键之处在于它使用一步接招一步的流程去构建东西,例如:尽管构建的每一步是不相同的但是每一个产品还是遵循相同的流程. ...

  4. 安装Oracle 9i - 初学者系列 - 学习者系列文章

    Oracle 9i数据库是经典的Oracle版本,就象SQL Server 2000一样.笔者最初使用到的Oracle版本就是Oracle 9i.下面就介绍下Oracle 9i的安装. 1.  下载O ...

  5. css-缩写

    border缩写 /*缩写前*/ element{ border-top-width:1px; border-top-style:solid; border-top-color:#cccccc; } ...

  6. windows下架设SVN服务器并设置开机启动

    原文:windows下架设SVN服务器并设置开机启动 1.安装SVN服务器,到http://subversion.apache.org/packages.html上下载windows版的SVN,并安装 ...

  7. CSS3中文手册基础知识

    CSS3手册是学习CSS3的最佳文档,不管是自己写博客,还是买书,手册少不了.今天我给大家介绍一些CSS3有哪些分类及其使用. 具体参考:http://caibaojian.com/css3/ 上来进 ...

  8. MVC 控制器

    ASP.NET MVC控制器(一) 前言 在路由的篇章中讲解了路由的作用,讲着讲着就到了控制器部分了,从本篇开始来讲解MVC中的控制器,控制器是怎么来的?MVC框架对它做了什么?以及前面有的篇幅所留的 ...

  9. MVC框架的插件与拦截器基础

    自制MVC框架的插件与拦截器基础 上篇谈到我自己写的MVC框架,接下来讲讲插件及拦截器! 在处理一些通用的逻辑最好把它封装一个插件或者拦截器,以便日后可以直接拿过来直接使用.在我的框架中可以通过继承以 ...

  10. MVC 5.1的遭遇:“已添加了具有相同键的项”

    ASP.NET MVC 3升级至MVC 5.1的遭遇:“已添加了具有相同键的项”   最近将一个项目从ASP.NET MVC 3升级至刚刚发布的ASP.NET MVC 5.1,升级后发现一个ajax请 ...