zoukankan      html  css  js  c++  java
  • 使用Android OpenGL ES 2.0绘图之六:响应触摸事件

    传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229

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

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

    1设置一个触摸监听器

            为了使你的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);  
    }  

    2对外暴露旋转角度

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

    3应用旋转

            想要绘制对象响应触摸事件而产生旋转,应该注释掉生成旋转角度的代码并添加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);  
    }  
            当你完成了上述步骤,运行程序,在屏幕上划动手指旋转三角形,看起来应该像下面这样:

    4示例源码

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

  • 相关阅读:
    【转】VS2010中 C++创建DLL图解
    [转]error: 'retainCount' is unavailable: not available in automatic reference counting mode
    [转]关于NSAutoreleasePool' is unavailable: not available in automatic reference counting mode的解决方法
    【转】 Tomcat v7.0 Server at localhost was unable to start within 45
    【转】Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds. If
    【转】SVN管理多个项目版本库
    【转】eclipse安装SVN插件的两种方法
    【转】MYSQL启用日志,和查看日志
    【转】Repository has not been enabled to accept revision propchanges
    【转】SVN库的迁移
  • 原文地址:https://www.cnblogs.com/innosight/p/3271129.html
Copyright © 2011-2022 走看看