(转)使用OpenGL显示图像(六)响应触摸事件

响应触摸事件

编写:jdneo - 原文:http://developer.android.com/training/graphics/opengl/touch.html

让对象根据预设的程序运动(如让一个三角形旋转),可以有效地引起用户的注意,但是如果希望让OpenGL ES的图形对象与用户交互呢?让我们的OpenGL ES应用可以支持触控交互的关键点在于,拓展GLSurfaceView的实现,重写onTouchEvent()方法来监听触摸事件。

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

配置触摸监听器

为了让我们的OpenGL ES应用响应触控事件,我们必须实现GLSurfaceView类中的onTouchEvent()方法。下面的例子展示了如何监听MotionEvent.ACTION_MOVE事件,并将事件转换为形状旋转的角度:

private final float TOUCH_SCALE_FACTOR = 180.0f / 320;
private float mPreviousX;
private float mPreviousY;

@Override
public boolean onTouchEvent(MotionEvent e) {
    // MotionEvent reports input details from the touch screen
    // and other input controls. In this case, you are only
    // interested in events where the touch position changed.

    float x = e.getX();
    float y = e.getY();

    switch (e.getAction()) {
        case MotionEvent.ACTION_MOVE:

            float dx = x - mPreviousX;
            float dy = y - mPreviousY;

            // reverse direction of rotation above the mid-line
            if (y > getHeight() / 2) {
              dx = dx * -1 ;
            }

            // reverse direction of rotation to left of the mid-line
            if (x < getWidth() / 2) {
              dy = dy * -1 ;
            }

            mRenderer.setAngle(
                    mRenderer.getAngle() +
                    ((dx + dy) * TOUCH_SCALE_FACTOR));
            requestRender();
    }

    mPreviousX = x;
    mPreviousY = y;
    return true;
}

注意在计算旋转角度后,该方法会调用requestRender()来告诉渲染器现在可以进行渲染了。这种办法对于这个例子来说是最有效的,因为图形并不需要重新绘制,除非有一个旋转角度的变化。当然,为了能够真正实现执行效率的提高,记得使用setRenderMode()方法以保证渲染器仅在数据发生变化时才会重新绘制图形,所以请确保这一行代码没有被注释掉:

public MyGLSurfaceView(Context context) {
    ...
    // Render the view only when there is a change in the drawing data
    setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}

公开旋转角度

上述样例代码需要我们公开旋转的角度,具体来说,是在渲染器中添加一个public成员变量。由于渲染器代码运行在一个独立的线程中(非主UI线程),我们必须同时将该变量声明为volatile。注意下面声明该变量的代码,另外对应的get和set方法也被声明为了public成员函数:

public class MyGLRenderer implements GLSurfaceView.Renderer {
    ...

    public volatile float mAngle;

    public float getAngle() {
        return mAngle;
    }

    public void setAngle(float angle) {
        mAngle = angle;
    }
}

应用旋转

为了应用触控输入所生成的旋转,注释掉创建旋转角度的代码,然后添加mAngle,该变量包含了触控输入所生成的角度:

public void onDrawFrame(GL10 gl) {
    ...
    float[] scratch = new float[16];

    // Create a rotation for the triangle
    // long time = SystemClock.uptimeMillis() % 4000L;
    // float angle = 0.090f * ((int) time);
    Matrix.setRotateM(mRotationMatrix, 0, mAngle, 0, 0, -1.0f);

    // Combine the rotation matrix with the projection and camera view
    // Note that the mMVPMatrix factor *must be first* in order
    // for the matrix multiplication product to be correct.
    Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, mRotationMatrix, 0);

    // Draw triangle
    mTriangle.draw(scratch);
}

当完成了上述步骤,我们就可以运行这个程序,并通过手指在屏幕上的滑动旋转三角形了:

原文地址:https://www.cnblogs.com/wangle1001986/p/8361318.html

时间: 2024-10-28 22:41:07

(转)使用OpenGL显示图像(六)响应触摸事件的相关文章

Android官方开发文档Training系列课程中文版:OpenGL绘图之响应触摸事件

原文地址:http://android.xsoftlab.net/training/graphics/opengl/touch.html 使图形按照程序设计的轨迹旋转对OpenGL来说还是不能发挥出它应有的实力.但要是能使用户可以直接控制图形的旋转,这才是OpenGL的真正目的.它真正的关键所在就是使程序可以交互式触摸.这主要靠重写GLSurfaceView的onTouchEvent()的方法来实现触摸事件的监听. 这节课将会展示如何监听触摸事件来使用户可以旋转图形. 设置触摸监听器 为了可以使

Android OpenGL ES绘图教程之六 :响应触摸事件

使对象根据预设的程序进行运动,比如旋转三角形,可以吸引人的注意力.但是如果你想让用户同你的OpenGL ES图形进行交互会怎么样呢?使你的OpenGL ES应用程序触摸互动的关键是要扩展GLSurfaceView,复写onTouchEvent()方法,来监听touch事件.本教程展示了,如何监听透出事件,让用户旋转一个OpenGL ES对象. 1.   设置一个Touch Listener 为了使你的OpenGL ES应用响应touch事件,你必须在GLSurfaceView类中实现OnTouc

UI和3D场景同时都需要响应触摸事件

比如战斗场景,UI和3D场景同时都需要响应触摸事件,如果同时响应可能就会出现触摸UI的时候影响到了3D部分.为了解决这个问题在判断3D响应之前要先判断手指是否点击在UI上. 以前NGUI的时候都是自己来发送射线判断,现在UGUI好了系统提供了更为简便的方法. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 #if UNITY_AN

Android自定义控件系列 十:利用添加自定义布局来搞定触摸事件的分发,解决组合界面中特定控件响应特定方向的事件

这个例子是比较有用的,基本上可以说,写完这一次,以后很多情况下,直接拿过来addView一下,然后再addInterceptorView一下,就可以轻轻松松的达到组合界面中特定控件来响应特定方向的触摸事件了. 请尊重原创劳动成果,转载请注明出处:http://blog.csdn.net/cyp331203/article/details/45198549,非允许请勿用于商业或盈利用途,违者必究. 在写Android应用的过程之中,经常会遇到这样的情况:界面包含了多个控件,我们希望触摸在界面上的不

(转)使用openGL显示图像(一)建立OpenGL ES的环境

编写:jdneo - 原文:http://developer.android.com/training/graphics/opengl/environment.html 要在应用中使用OpenGL ES绘制图像,我们必须为它们创建一个View容器.一种比较直接的方法是实现GLSurfaceView类和GLSurfaceView.Renderer类.其中,GLSurfaceView是一个View容器,它用来存放使用OpenGL绘制的图形,而GLSurfaceView.Renderer则用来控制在该

QUICK 中的触摸事件

本文转载于:http://www.cocos2d-x.org/docs/manual/framework/quick/V3/touch-events/zh Cocos2d-x 原本的触摸机制存在一些限制,在使用中需要开发者做不少额外的处理.所以 Quick-Cocos2d-x 提出了自己的一套触摸机制.本文详细介绍了这套新机制的用法. 显示层级 在 Cocos2d-x 里,整个游戏的画面是由一系列的 Scene, Node, Sprite, Layer 等对象构成的.而所有这些对象都是从 Nod

iOS触摸事件深度解析-备用

概述 本文主要解析从我们的手指触摸苹果设备到最终响应事件的整个处理机制.本质上讲,整个过程可以分为两个步骤: 步骤1:找目标.在iOS视图层次结构中找到触摸事件的最终接受者: 步骤2:事件响应.基于iOS响应者链(Responder Chain)处理触摸事件 找目标 在找目标阶段所使用到的两大利器是UIView的 hitTest:withEvent: 以及 pointInside:withEvent: 方法.找目标的过程也称为hit-Testing.先来看一张图(注: 图来自MJ)比较直观: 下

iOS中的四中触摸事件的详解 - 平移- 捏合 - 滑动(TouchesBegan,touchesMoved,touchesEnded,touchesCancelled)

RootViewController #import "RootViewController.h" #import "TouchView.h" #import "PanView.h" #import "PinchView.h" @interface RootViewController () @end @implementation RootViewController - (void)viewDidLoad { [super

Android触摸事件分发

Android的触摸分发机制和如何实现拦截 Android的触摸分发机制和如何实现拦截 前言 触摸事件的分发 情景分析 总结 前言 在自定义ViewGroup中,有时候需要实现触摸事件拦截,比如ListView下拉刷新就是典型的触摸事件拦截的例子.触摸事件拦截就是在触摸事件被parent view拦截,而不会分发给其child,即使触摸发生在该child身上.被拦截的事件会转到parent view的onTouchEvent方法中进行处理.但是这个交互过程还是挺复杂的,有多种情况,今天我们就来分