HI! 我目前正在扩展一个Android游戏框架,我在一本由Mario Zechner(他也开发Libgdx)编写的一本书中找到了。
到目前为止它工作得很好,我完成了框架的Java桌面实现。
但缺少一件小事,正确使用SoftKeyboard。
你可以尝试并重现我的错误,整个项目都在github上, 而android模块是“app”文件夹。 java版本(左箭头键=键返回)位于javalib模块中。
https://github.com/Railwanderer/AndroidGameFramework
框架使用Window FullScreenFlags和NoTitle Flags以及Surface View进行渲染。
AndroidGame类中的标志:
// set FullScreen
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
表面视图:
public class AndroidFastRenderView extends SurfaceView implements Runnable {
AndroidGame game;
Bitmap framebuffer;
Thread renderThread = null;
SurfaceHolder holder;
// Fps Counting Stuff...
static long lastTime;
static double fps;
static String FPS = "";
volatile boolean running = false;
public AndroidFastRenderView(AndroidGame game, Bitmap framebuffer) {
super(game);
this.game = game;
this.framebuffer = framebuffer;
this.holder = getHolder();
}
public void resume() {
running = true;
renderThread = new Thread(this);
renderThread.start();
}
public void run() {
Rect dstRect = new Rect();
long startTime = System.nanoTime();
while (running) {
if (!holder.getSurface().isValid())
continue;
lastTime = System.nanoTime();
float deltaTime = (System.nanoTime() - startTime) / 1000000000.0f;
startTime = System.nanoTime();
game.getCurrentScreen().update(deltaTime);
Graphics g = game.getGraphics();
g.clear(Color.BLACK);
game.getCurrentScreen().present(deltaTime);
g.drawString(FPS,framebuffer.getWidth()-100,framebuffer.getHeight()-30);
Canvas canvas = holder.lockCanvas();
canvas.getClipBounds(dstRect);
canvas.drawBitmap(framebuffer, null, dstRect, null);
holder.unlockCanvasAndPost(canvas);
//one second(nano) divided by amount of time it takes for one frame to finish
fps = 1000000000.0 / (System.nanoTime() - lastTime);
lastTime = System.nanoTime();
FPS = "FPS: " + (int) fps;
}
}
public void pause() {
running = false;
while (true) {
try {
renderThread.join();
break;
} catch (InterruptedException e) {
// retry
}
}
}
我的问题是当我尝试拉起SoftKeyboard 时,它会显示何时 用SHOW_FORCED调用。它也位于我的表面视图的顶部,但触摸事件不会触发键盘,但不知何故通过并击中我的表面视图。
public void showKeyboard(){
inputManager.showSoftInput(view, InputMethodManager.SHOW_FORCED);
}
当我像疯了一样击中软键盘的最上边框(第一行键上边缘)时,最终一些触摸事件实际上触发了键。但它只适用于第一行键并且根本不满足。 我得到印象,因为记录的触摸事件以偏移量返回,整个事情都会发生变化。
我目前正在使用任何keyEvent(键侦听器的第一行onKey()方法)调用软键盘。所以后退键会触发键盘。此密钥始终被识别,因为它是我设备上的硬键。
- 是否可以使用可调整大小的布局存档全屏?我猜它的标志阻止键盘正常工作。 - 结合两者的其他想法?
此外我的android清单,这个应用程序使用的唯一xml文件:
<application android:icon="@mipmap/ic_launcher" android:label="TestGame">
<activity android:name="railwanderer.androidgameframework.ExampleAndroidGame.StartClass"
android:label="StartClass"
android:screenOrientation="landscape"
android:configChanges="keyboard|keyboardHidden|orientation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="9"/>
答案 0 :(得分:1)
我找到了解决方法:D https://stackoverflow.com/questions/33561137/soft-keyboard-not-receiving-touches-over-surfaceview
我在CustomSurfaceView类上覆盖了onCreateInputConnection方法,就像在发布的链接中一样。
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
InputConnection conn = super.onCreateInputConnection(outAttrs);
outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_FULLSCREEN;
return conn;
}
现在可以使用了,请尝试一下,我会立即上传,看看它是否适用于您的设备。