HI! В настоящее время я расширяю платформу Android Game Framework, которую я нашел в книге, написанной Марио Зехнером (который также разрабатывает Libgdx).
Он отлично работает до сих пор, и я выполнил реализацию Java Desktop Framework.
Но одна крошечная вещь отсутствует, правильное использование SoftKeyboard.
Вы можете попробовать и воспроизвести мою ошибку, весь проект находится на github, и модуль android является папкой "приложение". Версия java (клавиша с левой стрелкой = клавиша) находится в модуле javalib.
https://github.com/Railwanderer/AndroidGameFramework
В Framework используются окна FullScreenFlags и NoTitle Flags в сочетании с представлением поверхности для рендеринга.
Флаги в классе 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);
}
Когда я нажимаю самую верхнюю границу мягкой клавиатуры (верхние края первой строки), как сумасшедшие, в конечном итоге некоторые сенсорные события фактически вызывают ключи. Но он работает только для первой линии ключей и не удовлетворяет вообще. Я получаю Impression, что все это смещается, поскольку записанные события касания возвращаются со смещением.
В настоящее время я вызываю мягкую клавиатуру с любым ключом (first line 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"/>