我有一个 NDK 项目,我正在使用 opengl 进行渲染。我正在从 C++ 处理这一切。我还能够使用 jni 创建一个 android.widget.Button 并连接它的回调。当我按下屏幕时,回调会触发,所以我知道我有一个有效的 UI 元素。
问题是按钮不可见。我假设它被 GL 隐藏了。我需要某种方式在顶部 GL 上绘制 UI。
由于 ndk 中的 GL 没有 glsurfaceview,我不能只将它和按钮粘贴在某些 android 布局中并让它处理问题。
有什么想法吗?
最佳答案
我找到了解决方案 here但我在这里复制了要点。非常感谢 mkandula 的出色解释
创建一个 GUIActivity 类,它将处理交互并将使用它们或将它们传递给底层的 AppInterface 类
public class GUIActivity extends Activity
在主 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); }
将新 Activity 添加到您的 list
<activity android:name="GUIActivity" android:label="GUIActivity" android:theme="@style/Theme.Transparent" android:configChanges="orientation|keyboardHidden|screenSize|smallestScreenSize"> </activity>
在 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/