2016-04-28 2 views
0

HI! В настоящее время я расширяю Android Game Framework, который я нашел в книге, написанной Марио Зехнером (который также разрабатывает Libgdx).Мягкая клавиатура Android в полноэкранном режиме Вид поверхности

Он отлично работает до сих пор, и я выполнил реализацию Java Desktop Framework.

Но одна крошечная вещь отсутствует, правильное использование SoftKeyboard.

Вы можете попробовать и воспроизвести мою ошибку, весь проект на GitHub, и андроид модуль является «приложение» папку. Версия java (клавиша со стрелкой влево = ключ назад) находится в модуле javalib.

https://github.com/Railwanderer/AndroidGameFramework

рамочные использует Window FullScreenFlags и NoTitle Флаги в сочетании с поверхностью 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); 
} 

Когда я попал в большую верхнюю границу мягкой клавиатуры (первые клавиши линии верхних кромок), как сумасшедший, в конце концов некоторые сенсорные события на самом деле вызвать ключи. Но он работает только для первой линии ключей и не удовлетворяет вообще. Я получаю Impression, что все это смещается, поскольку записанные события касания возвращаются со смещением.

В настоящее время я вызываю мягкую клавиатуру с любым keyEvent (первая строка onKey() метода прослушивания клавиш). поэтому задняя клавиша вызовет клавиатуру. Этот ключ всегда распознается, поскольку он является жестким ключом на моем устройстве.

-У вас есть возможность архивировать полноэкранный режим с возможностью изменения размера? Я предполагаю, что его флаги препятствуют правильной работе клавиатуры. -нибудь другие идеи, чтобы объединить оба?

Кроме того здесь мой андроид манифеста, только 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"/> 

ответ

1

Я нашел решения: D https://stackoverflow.com/questions/33561137/soft-keyboard-not-receiving-touches-over-surfaceview

я переопределить onCreateInputConnection метод на Класс CustomSurfaceView, как в размещенной ссылке.

@Override 
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) { 
    InputConnection conn = super.onCreateInputConnection(outAttrs); 
    outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_FULLSCREEN; 
    return conn; 
} 

он теперь работает, пожалуйста попробуйте его, я буду загружать сразу увидеть, если он работает на устройстве тоже.

Смежные вопросы