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

问题描述 投票:0回答:1

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

问题是该按钮不可见。我假设它被GL隐藏了。我需要一些在顶级GL上绘制UI的方法。

由于在ndk中的GL没有glsurfaceview我不能只是坚持它和一些Android布局中的按钮让它处理问题。

有什么想法吗?

android c++ opengl-es android-ndk
1个回答
1
投票

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

  1. 创建一个GUIActivity类,它将处理交互,并将使用它们或将它们传递给底层的AppInterface类 public class GUIActivity extends Activity
  2. 在您的主要活动的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 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>

这将使您达到对原生活动进行透明活动的程度,而无需更改本机代码的任何工作方式。

您可能想要传递触摸事件,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);
}
© www.soinside.com 2019 - 2024. All rights reserved.