android - 如何检测android中某个渲染器区域内的触摸事件?

标签 android opengl-es

在 android 中,我采用了一个旋转球体示例 given here .它创建了一个显示旋转球体(地球)的简单应用程序。

现在,如果在手机显示屏上按下旋转球体,我想做点什么。我不想对旋转球体外部的触摸事件使用react。到目前为止,这是我通过使用 GLSurfaceView 的派生版本所做的尝试:

public class MyGLSurfaceView extends GLSurfaceView {



    MyGLSurfaceView(Context context) {
        super(context);
    }

    public boolean onTouchEvent(MotionEvent event) {
        int x = (int)event.getX();
        int y = (int)event.getY();
        Log.d("onTouchEvent",String.format("keyCode: %d  coords: %d  %d", event.getActionMasked(), x, y));

        Renderer renderer = this.Renderer.getRenderer(); // ERROR
        return super.onTouchEvent(event);
    }

}

如果没有 ERROR 行,这段代码就可以工作,当我按下显示屏时,我得到了 x/y 坐标。

但是,为了评估事件是否在球体,我的方法是获取具有 Sphere 对象的渲染器以确定 x/y坐标在球体内。

但是 ERROR 行不起作用,我收到一条错误消息

Error:(26, 56) error: cannot find symbol method getRenderer()

我该如何解决这个错误;还是有更理智的方法来自动查明事件是否在 Sphere-graphics-object 上?

也许更改构造函数并将渲染器实例也传递给 MyGLSurfaceView 是个好主意?附录:这个想法似乎行不通。我收到一个我不明白的构造函数错误...

最佳答案

您的问题比检测触摸事件要复杂得多。渲染器不仅拥有球体对象,它还拥有整个 OpenGL ES 内容。因此,即使在检测到触摸事件之后,您仍需要将屏幕 2D 坐标转换为 3D 射线并检查它是否与球体相交。这称为光线转换Here是光线转换算法的一个很好的解释。还有一个 good video tutorial用于实现光线转换 Java。

此外,您还需要按照您和@satm12 的建议在 GLSurfaceView 的构造函数中传递渲染器。

关于android - 如何检测android中某个渲染器区域内的触摸事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41346942/

相关文章:

android - 图像的颜色深度和/或压缩级别如何影响 UI 性能?

java - 图像无法正确缩放

android - 最便宜的 Android 1.5 设备

java - 矩阵 vector 乘法

android - OpenGL ES 着色器降低太多性能

javascript - 是否可以使用 gl.finish() 测量 webgl 中的渲染时间?

java - IBM Worklight - 无法在 Android 中获取网络信号强度

android - 从操作栏 Activity 中删除标题

android - 暂停 Android ndk 应用程序时如何保留 EGL 上下文

ios - 从XCode OpenGL ES调试器隐藏着色器代码