2016-04-28 1 views
0

HI! Je suis en train d'élargir un cadre de jeu Android, que j'ai trouvé dans un livre écrit par Mario Zechner (qui développe également Libgdx).Clavier virtuel Android en plein écran Vue de la surface

Cela fonctionne très bien jusqu'à présent et j'ai accompli une mise en œuvre Java Desktop de l'infrastructure.

Mais une chose minuscule manque, l'utilisation correcte du SoftKeyboard.

Vous pouvez essayer et reproduire mon bug, l'ensemble du projet est sur GitHub, et le module Android est le dossier « app ». La version java (touche flèche vers la gauche = touche retour) se trouve dans le module javalib.

https://github.com/Railwanderer/AndroidGameFramework

Le cadre utilise la fenêtre FullScreenFlags et drapeaux notitle en combinaison avec une vue de surface pour le rendu.

Les drapeaux de AndroidGame Classe:

// set FullScreen 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); 

La vue de la surface:

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 
     } 
    } 
} 

Mon problème est quand j'essaie de tirer vers le haut le SoftKeyboard, il montrerait quand appeler avec SHOW_FORCED . Il se pose également sur ma vue de surface, mais les événements tactiles ne déclenchent pas le clavier, mais en quelque sorte passer à travers et frapper ma vue de surface.

public void showKeyboard(){ 
    inputManager.showSoftInput(view, InputMethodManager.SHOW_FORCED); 
} 

Quand je frappe le plus bord supérieur du clavier souple (premières touches de ligne de bords supérieurs) comme un fou, éventuellement certains événements tactiles déclenchent réellement les clés. Mais cela ne fonctionne que pour la première ligne de touches et pas du tout satisfaisant. J'ai l'impression que le tout est décalé depuis que les événements tactiles enregistrés reviennent avec un décalage.

J'appelle actuellement le clavier logiciel avec n'importe quelle méthode keyEvent (première ligne onKey() de l'écouteur de touche). donc la touche retour déclenchera le clavier. Cette clé est toujours reconnue car c'est une clé dure sur mon appareil.

-Existe-t-il une possibilité d'archiver en plein écran avec une mise en page redimensionnable? Je suppose que c'est les drapeaux qui empêchent le clavier de fonctionner correctement. -Autres idées pour combiner les deux?

De plus ici mon manifeste Android, le seul fichier xml cette application utilise:

<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"/> 

Répondre

1

J'ai trouvé une solution: D https://stackoverflow.com/questions/33561137/soft-keyboard-not-receiving-touches-over-surfaceview

Je n'outrepasser onCreateInputConnection méthode sur la Classe CustomSurfaceView, comme dans le lien posté.

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

cela fonctionne maintenant, pls essayer, je vais télécharger tout de suite pour voir si cela fonctionne sur votre appareil aussi.