我有一个NDK项目,我使用opengl进行渲染。我正在用c ++处理这一切。我也能够使用jni创建一个android.widget.Button并挂钩它的回调。当我按下屏幕时,回调会触发,所以我知道我有一个有效的UI元素。
问题是该按钮不可见。我假设它被GL隐藏了。我需要一些在顶级GL上绘制UI的方法。
由于在ndk中的GL没有glsurfaceview我不能只是坚持它和一些Android布局中的按钮让它处理问题。
有什么想法吗?
我找到了解决方案here,但我在这里复制了重点。非常感谢mkandula的出色解释
public class GUIActivity extends Activity
// 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 android:name="GUIActivity"
android:label="GUIActivity"
android:theme="@style/Theme.Transparent"
android:configChanges="orientation|keyboardHidden|screenSize|smallestScreenSize">
</activity>
<?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);
}