OpenGL中添加Motion

书接上文,Android OpenGL二 —— 使用投影和相机变换

在屏幕上绘制对象,是OpenGL比较基本的特性。如果你只想做这些,你完全可以使用包括Canvas和Drawable类的Android的图形框架。

OpenGL ES为三维空间中的对象绘制,扩展了移动、变换等引人入胜的用户体验。

In this lesson, you take another step forward into using OpenGL ES by learning how to add motion to a shape with rotation

对图形做旋转操作

对绘制的对象做旋转操作相当简单。在你的渲染器中,另外创建一个关于旋转的转换矩阵,然后和你的投影和相机转换视图矩阵链接起来(有关投影和相机视图,请查看上一篇文章)。

private float[] mRotationMatrix = new float[16];
public void onDrawFrame(GL10 gl) {float[] scratch = new float[16];...// 为三角形创建旋转变换long time = SystemClock.uptimeMillis() % 4000L;float angle = 0.090f * ((int) time);Matrix.setRotateM(mRotationMatrix, 0, angle, 0, 0, -1.0f);// 将旋转矩阵和投影、相机视图链接到一起// 为了矩阵乘积的正确性,必须将*mMVPMatrix*放在首位Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, mRotationMatrix, 0);// 绘制三角形mTriangle.draw(scratch);
}

添加了上述代码后,如果你的三角形还不能旋转,请确认你是否添加了 GLSurfaceView.RENDERMODE_WHEN_DIRTY设置。

启用连续绘制

如果你严格按照该系列博客编写代码,确保你已经注释掉将渲染模式设置为只要当图形改变时才绘制的代码,否则图形的旋转只用在requestRender()才会生效。如下:

public MyGLSurfaceView(Context context) {...// 只要当绘制数据发生变化时才绘制视图//为了使三角形能够自动旋转,注释掉这句//setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}

这个绘制模式的设置,如非必要,请尽量打开。

响应触控事件

想要让你设计的OpenGL ES图形和用户做交互。只需要继承GLSurfaceView的类重写GLSurfaceViewonTouchEvent()方法,用于监听触控事件。

设置触控监听

private final float TOUCH_SCALE_FACTOR = 180.0f / 320;
private float mPreviousX;
private float mPreviousY;@Override
public boolean onTouchEvent(MotionEvent e) {// 触摸事件用各种输入设备传递,现在流行的触控屏就是典型的触摸事件输入设备。float x = e.getX();float y = e.getY();switch (e.getAction()) {//监听Move事件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.setAngle(mRenderer.getAngle() +((dx + dy) * TOUCH_SCALE_FACTOR));requestRender();//通知渲染器,是时候绘制了。}mPreviousX = x;mPreviousY = y;return true;
}

再次提醒,如果发现无效的话,请检查如下代码是否取消注释。

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

暴露旋转角

上面的实例代码的正常运行,需要将旋转角通过公共的方法在渲染器中暴露出来。因为,渲染器代码试运行在主线程以外的线程中的,所以,变量需要加上volatile申明。下面是实例代码:

public class MyGLRenderer implements GLSurfaceView.Renderer {...public volatile float mAngle;public float getAngle() {return mAngle;}public void setAngle(float angle) {mAngle = angle;}
}

应用

为了使用通过触控输入的转角,现将生成angle和mAngle的代码注释掉,因为它们包含触控生成角度的代码。

public void onDrawFrame(GL10 gl) {...float[] scratch = new float[16];// 为三角形创建旋转变换// long time = SystemClock.uptimeMillis() % 4000L;// float angle = 0.090f * ((int) time);Matrix.setRotateM(mRotationMatrix, 0, mAngle, 0, 0, -1.0f);// 将旋转矩阵和投影、相机视图链接到一起// 为了矩阵乘积的正确性,必须将*mMVPMatrix*放在首位Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, mRotationMatrix, 0);// Draw trianglemTriangle.draw(scratch);
}

效果图

源码地址:https://github.com/MrHeLi/OpenGLDemo

Android OpenGL三——旋转和触控事件相关推荐

  1. 【Android 应用开发】多点触控 ( 多点触控事件 | PointerId | PointerIndex | 坐标获取 | 触摸点个数 )

    文章目录 I . 多点触控事件 II . PointerId 与 PointerIndex 简介 III . 本次 PointerId 与 PointerIndex 获取 IV . PointerId ...

  2. Android多点触控之——MotionEvent(触控事件)

    今天晚上刚学习了一个多点触控的小程序,后面想对其做一个定制.在写的时候遇到很多问题,于是乎就查了一下API文档,又到网上查了一下高手的文章,最后自己又实践了一下.终于把多点触控事件监听的大概原理给弄清 ...

  3. android motionevent 坐标,Android坐标系、视图坐标系与触控事件(MotionEvent)

    前言:本篇文章讲解Android坐标系.视图坐标系与触控事件(MotionEvent) 一. Android 的坐标系:#### 在Android中,将屏幕左上角的定点座位Android坐标系的原点, ...

  4. h5 js 小米 平板 手机 ontouchend touchend 事件 三指及三指以上触控问题

    小米平板 小米手机 在h5情况下 无论chrome还是微信浏览器情况下 均出现三指及三指以上触控无法正常触发 touchend 事件 但是三指及三指以上小米会触发 touchcancel 事件 就可以 ...

  5. Android自定义View的多点触控

    在Android游戏开发中,自定义View的多点触控技术必不可少,本文主要简单讲解下Android中多点触控技术的基础知识. 所谓多点触控技术,就是手机屏幕上支持同时处理多个触控点的触屏或移动事件.多 ...

  6. Android开发实例之多点触控程序

    智能终端设备的多点触控操作为我们带来了种种炫酷体验,这也使得很多Android开发者都对多点触控程序的开发感兴趣.实际上多点触控程序的实现并不是那么遥不可及,而是比较容易.本文就主要通过一个实例具体讲 ...

  7. [AS3]移动设备上的触控事件和手势

    目录 一.目的 1.想:因为flash中有些是触摸屏多点操作,所以需要使用到触控事件 二.参考 1.官网 1.[AS3]移动设备上的触控事件和手势 三.注意 1.一定要写 2.拖动物体时候,不要使用跟 ...

  8. QT 触控事件和鼠标事件的分离(问题已解决)

    问题:QT图形视图框架,QGraphicsScene中默认接收触控事件,会将第一个点当作鼠标事件处理. 在开发者开发的时候,可能会有这样的需求,希望自己的触控事件和鼠标事件能够分割开来. 找到的解决方 ...

  9. 触控事件MotionEvent

    MotionEvent中封装的一些常用的事件常量: //单点触摸按下动作 public static final int ACTION_DOWN = 0; //单点触摸抬起动作 public stat ...

最新文章

  1. php p3p跨域登录,php+ajax实现多域名跨域登录例子(基于P3P)
  2. Problem C: 指针:自定义函数length,调用它计算字符串的长度
  3. oc runtime
  4. ADO.NET Entity Framework 使用数据定义语言(实体框架)
  5. Revit二次开发之“创建尺寸标注”
  6. 用柠檬来发电真的可行吗?
  7. [渝粤教育] 中国地质大学 国际贸易理论 复习题 (2)
  8. Percona XtraBackup热备份实践
  9. saltstack 自动化运维神器(四)salt-ssh
  10. AI系统可以自动生成逼真的人工星系图像
  11. tcpdump抓包分析
  12. 数学中 对数log 指数
  13. ViewPage的基本使用以及动画效果的添加
  14. 潇洒郎:Ten-fold-cross validation- Naïve Bayes Classifier 十字交叉验证-贝叶斯分类器 Python实现
  15. 嵌入式linux根文件系统制作--busybox
  16. /etc/fstab详细参数配置
  17. 浅谈数字后端工程师的工作
  18. jQuery入门与实战
  19. (区块链溯源)基于Hyperledger Fabric 的农产品区块链溯源方法
  20. 爬虫终于找到了知乎/B站 Top100大V,关注!

热门文章

  1. layui checkbox Ajax提交name只有拿到最后一个值value解决办法,无法全选
  2. 【观察】IBM冯靓:混合云时代的原生安全观
  3. 超多水分(没写错),教你三步点赞100000+
  4. PHP laravel artisan将图片转换成PDF
  5. HtmlUnit的使用
  6. layer.msg参数含义
  7. Pane和Panel
  8. Markdown 使用 Emoji 表情
  9. mysql中怎样插入外键_MySQL 添加外键
  10. table无限嵌套table