android - 如何在 NDK 项目中的 GL 之上绘制 android UI 元素

标签 android c++ opengl-es android-ndk

我有一个 NDK 项目,我正在使用 opengl 进行渲染。我正在从 C++ 处理这一切。我还能够使用 jni 创建一个 android.widget.Button 并连接它的回调。当我按下屏幕时,回调会触发,所以我知道我有一个有效的 UI 元素。

问题是按钮不可见。我假设它被 GL 隐藏了。我需要某种方式在顶部 GL 上绘制 UI。

由于 ndk 中的 GL 没有 glsurfaceview,我不能只将它和按钮粘贴在某些 android 布局中并让它处理问题。

有什么想法吗?

最佳答案

我找到了解决方案 here但我在这里复制了要点。非常感谢 mkandula 的出色解释

  1. 创建一个 GUIActivity 类,它将处理交互并将使用它们或将它们传递给底层的 AppInterface 类

    public class GUIActivity extends Activity
    
  2. 在主 Activity 的 onCreate 方法中创建 GUIActivity

    // Inside AppInterface
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = this.getApplication().getApplicationContext();
        Intent startNewActivityOpen = new Intent(this, GUIActivity.class);
        startActivity(startNewActivityOpen);
    }
    
  3. 将新 Activity 添加到您的 list

    <activity android:name="GUIActivity"
              android:label="GUIActivity"
              android:theme="@style/Theme.Transparent"
              android:configChanges="orientation|keyboardHidden|screenSize|smallestScreenSize">
    </activity>
    
  4. 在 res/values/styles.xml 下为您的项目添加透明主题

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
      <style name="Theme.Transparent" parent="android:Theme">
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:backgroundDimEnabled">false</item>
      </style>
    </resources>
    

这将使您达到这样一种程度,即您可以在不更改任何 native 代码工作方式的情况下对 native Activity 进行透明操作。

您可能想要传递触摸事件,mkandula 建议使用以下内容。我还没有对此进行测试,但我毫不怀疑它会起作用,因为他的其余答案都是正确的。

@Override
public boolean onTouchEvent(MotionEvent ev) {
    if (isViewInGameMode == true) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN)
            AppInterface.OnTouchStart(ev.getX(), ev.getY());
        else if (ev.getAction() == MotionEvent.ACTION_MOVE)
            AppInterface.OnTouchUpdate(ev.getX(), ev.getY());
        else if (ev.getAction() == MotionEvent.ACTION_UP)
            AppInterface.OnTouchEnd(ev.getX(), ev.getY());
        else {
            System.out.println("action " + ev.getAction()
                               + " unaccounted for in OnTouchEvent");
        }
    }
    return super.onTouchEvent(ev);
}

关于android - 如何在 NDK 项目中的 GL 之上绘制 android UI 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26361447/

相关文章:

android - 如何最好地实现共享一项服务的两项 Activity (带蓝牙连接)?

c++ - std::swap 丢失了基于类型的别名分析使用的信息?

android - 如何启动超过16个安卓模拟器

android - onBackPressed() 在 android 4.0.3 中的 ActivityGroup 中不起作用

c++ - 在 C++ 中从字符串计算算术表达式

c++ - 我应该在使用 STL 集时重载 == 运算符吗?

java - 在 Android 上快速开始使用 opengl

android - 使用OpenGL ES 2.0在Android上创建音频波

iphone - Xcode 缺少 OpenGLES.framework

android - android DatePicker DialogFragment 的自定义主题显示令人不快的边框