OSDN Git Service

[changed] Input has setCatchBackKey() now. Works as intended
authorbadlogicgames <badlogicgames@6c4fd544-2939-11df-bb46-9574ba5d0bfa>
Mon, 25 Oct 2010 18:46:08 +0000 (18:46 +0000)
committerbadlogicgames <badlogicgames@6c4fd544-2939-11df-bb46-9574ba5d0bfa>
Mon, 25 Oct 2010 18:46:08 +0000 (18:46 +0000)
[added] methods to Input implementations.
[changed] UITest demonstrates back key catching.
[changed] added on-screen keyboard demo to UITest. Press the button in the bottom left corner to bring up the keyboard on Android.

backends/gdx-backend-android/src/com/badlogic/gdx/backends/android/AndroidInput.java
backends/gdx-backend-applet/src/com/badlogic/gdx/backends/applet/AppletInput.java
backends/gdx-backend-desktop/src/com/badlogic/gdx/backends/desktop/JoglInput.java
backends/gdx-backend-lwjgl/src/com/badlogic/gdx/backends/desktop/LwjglInput.java
gdx/src/com/badlogic/gdx/Input.java
gdx/src/com/badlogic/gdx/graphics/Font.java
gdx/src/com/badlogic/gdx/graphics/SpriteBatch.java
tests/gdx-tests/src/com/badlogic/gdx/tests/UITest.java

index c54e6e3..9232f01 100644 (file)
@@ -29,6 +29,7 @@ import android.view.MotionEvent;
 import android.view.View;\r
 import android.view.View.OnKeyListener;\r
 import android.view.View.OnTouchListener;\r
+import android.view.inputmethod.InputMethodManager;\r
 import android.widget.EditText;\r
 \r
 import com.badlogic.gdx.Input;\r
@@ -82,6 +83,9 @@ final class AndroidInput implements Input, OnKeyListener, OnTouchListener, Senso
 \r
        /** touch handler sleep time in milliseconds **/\r
        private int sleepTime = 0;\r
+       \r
+       /** what system keys to catch **/       \r
+       private boolean catchBack = false;      \r
 \r
        /**\r
         * helper enum\r
@@ -305,9 +309,15 @@ final class AndroidInput implements Input, OnKeyListener, OnTouchListener, Senso
 \r
        @Override public boolean onKey (View v, int keyCode, KeyEvent event) {\r
                synchronized (eventQueue) {\r
+                       char character = (char)event.getUnicodeChar();\r
+                       \r
+                       // Android doesn't report a unicode char for back space. hrm...\r
+                       if( keyCode == 67 )\r
+                               character = '\b';\r
+                       \r
                        if (event.getAction() == KeyEvent.ACTION_DOWN) {\r
                                Event ev = freeEvents.get(freeEventIndex++);\r
-                               ev.set(EventType.KeyDown, 0, 0, 0, event.getKeyCode(), (char)event.getUnicodeChar());\r
+                               ev.set(EventType.KeyDown, 0, 0, 0, event.getKeyCode(), character);\r
                                eventQueue.add(ev);\r
                                keys.add(event.getKeyCode());\r
                        }\r
@@ -315,15 +325,16 @@ final class AndroidInput implements Input, OnKeyListener, OnTouchListener, Senso
                                keys.remove(event.getKeyCode());\r
 \r
                                Event ev = freeEvents.get(freeEventIndex++);\r
-                               ev.set(EventType.KeyUp, 0, 0, 0, event.getKeyCode(), (char)event.getUnicodeChar());\r
+                               ev.set(EventType.KeyUp, 0, 0, 0, event.getKeyCode(), character);\r
                                eventQueue.add(ev);\r
 \r
                                ev = freeEvents.get(freeEventIndex++);\r
-                               ev.set(EventType.KeyTyped, 0, 0, 0, event.getKeyCode(), (char)event.getUnicodeChar());\r
+                               ev.set(EventType.KeyTyped, 0, 0, 0, event.getKeyCode(), character);\r
                                eventQueue.add(ev);\r
                        }\r
                }\r
-\r
+               \r
+               if( catchBack && keyCode == KeyEvent.KEYCODE_BACK ) return true;\r
                return false;\r
        }\r
 \r
@@ -342,10 +353,19 @@ final class AndroidInput implements Input, OnKeyListener, OnTouchListener, Senso
        }\r
 \r
        @Override public void setOnscreenKeyboardVisible (boolean visible) {\r
-               // FIXME\r
+               InputMethodManager manager = (InputMethodManager)app.getSystemService( Context.INPUT_METHOD_SERVICE );\r
+               if( visible ) {                 \r
+                       manager.showSoftInput( ((AndroidGraphics)app.getGraphics()).getView(), 0 );\r
+               } else {\r
+                       manager.hideSoftInputFromWindow( ((AndroidGraphics)app.getGraphics()).getView().getWindowToken(), 0 );          \r
+               }                       \r
        }\r
 \r
        @Override public boolean supportsOnscreenKeyboard () {\r
                return true;\r
        }\r
+\r
+       @Override public void setCatchBackKey (boolean catchBack) {\r
+               this.catchBack = catchBack;             \r
+       }\r
 }\r
index 8500448..869b1a4 100644 (file)
@@ -154,4 +154,7 @@ final class AppletInput implements Input, RenderListener {
                return false;\r
        }\r
 \r
+       @Override public void setCatchBackKey (boolean catchBack) {\r
+                       \r
+       }\r
 }\r
index a70bef9..5068f73 100644 (file)
@@ -153,4 +153,8 @@ final class JoglInput implements Input, RenderListener {
        @Override public boolean supportsOnscreenKeyboard () {\r
                return false;\r
        }\r
+       \r
+       @Override public void setCatchBackKey (boolean catchBack) {\r
+               \r
+       }\r
 }\r
index bd081b9..5873368 100644 (file)
@@ -291,4 +291,8 @@ final class LwjglInput implements Input, RenderListener {
        @Override public boolean supportsOnscreenKeyboard () {\r
                return false;\r
        }\r
+       \r
+       @Override public void setCatchBackKey (boolean catchBack) {\r
+               \r
+       }\r
 }\r
index ed2ab98..d4f6a8e 100644 (file)
@@ -53,7 +53,7 @@ public interface Input {
         */\r
        public interface TextInputListener {\r
                public void input (String text);\r
-       }\r
+       }       \r
 \r
        /**\r
         * Keys.\r
@@ -277,4 +277,12 @@ public interface Input {
         * @return whether multitouch is supported\r
         */\r
        public boolean supportsMultitouch ();   \r
+       \r
+       /**\r
+        * Sets whether the BACK button on Android should be caught. This\r
+        * will prevent the app from being paused. Will have no effect on the desktop.\r
+        * \r
+        * @param catchBack whether to catch the back button\r
+        */\r
+       public void setCatchBackKey( boolean catchBack );\r
 }\r
index a0aa754..31d1a3f 100644 (file)
@@ -159,6 +159,8 @@ public abstract class Font {
        }\r
 \r
        private Glyph createGlyph (char character) {\r
+               if( Character.isISOControl( character ) ) return null;\r
+               \r
                Pixmap bitmap = getGlyphBitmap(character);\r
                Rectangle rect = new Rectangle();\r
                getGlyphBounds(character, rect);\r
index 4138ec4..4054898 100644 (file)
@@ -707,7 +707,8 @@ public class SpriteBatch {
                for (int i = 0; i < len; i++) {\r
                        char c = text.charAt(i);\r
                        Glyph g = font.getGlyph(c);\r
-\r
+                       if( g == null ) continue;\r
+                       \r
                        final float fx = x;\r
                        final float fx2 = x + g.width;\r
                        final float fy2 = y + g.height;\r
index e99bc4c..aa62f51 100644 (file)
@@ -1,16 +1,17 @@
 \r
 package com.badlogic.gdx.tests;\r
 \r
-import com.badlogic.gdx.Files.FileType;\r
 import com.badlogic.gdx.Gdx;\r
 import com.badlogic.gdx.InputListener;\r
-import com.badlogic.gdx.RenderListener;\r
+import com.badlogic.gdx.Files.FileType;\r
+import com.badlogic.gdx.graphics.Font;\r
 import com.badlogic.gdx.graphics.GL10;\r
 import com.badlogic.gdx.graphics.Texture;\r
-import com.badlogic.gdx.graphics.Texture.TextureFilter;\r
-import com.badlogic.gdx.graphics.Texture.TextureWrap;\r
 import com.badlogic.gdx.graphics.TextureAtlas;\r
 import com.badlogic.gdx.graphics.TextureRegion;\r
+import com.badlogic.gdx.graphics.Font.FontStyle;\r
+import com.badlogic.gdx.graphics.Texture.TextureFilter;\r
+import com.badlogic.gdx.graphics.Texture.TextureWrap;\r
 import com.badlogic.gdx.math.Vector2;\r
 import com.badlogic.gdx.scenes.scene2d.Actor;\r
 import com.badlogic.gdx.scenes.scene2d.Stage;\r
@@ -28,7 +29,9 @@ import com.badlogic.gdx.scenes.scene2d.actions.ScaleTo;
 import com.badlogic.gdx.scenes.scene2d.actions.Sequence;\r
 import com.badlogic.gdx.scenes.scene2d.actors.Button;\r
 import com.badlogic.gdx.scenes.scene2d.actors.Image;\r
+import com.badlogic.gdx.scenes.scene2d.actors.Label;\r
 import com.badlogic.gdx.scenes.scene2d.actors.LinearGroup;\r
+import com.badlogic.gdx.scenes.scene2d.actors.Button.ClickListener;\r
 import com.badlogic.gdx.scenes.scene2d.actors.LinearGroup.LinearGroupLayout;\r
 import com.badlogic.gdx.tests.utils.GdxTest;\r
 \r
@@ -37,16 +40,20 @@ public class UITest implements GdxTest, InputListener {
        Texture badlogic;\r
        TextureAtlas atlas;\r
        Stage ui;\r
+       Font font;\r
 \r
        @Override public void surfaceCreated () {\r
                if (uiTexture == null) {\r
                        Gdx.input.addInputListener(this);\r
+                       Gdx.input.setCatchBackKey( true );\r
 \r
+                       font = Gdx.graphics.newFont( "Droid Sans", 20, FontStyle.Plain );\r
+                       \r
                        uiTexture = Gdx.graphics.newTexture(Gdx.files.getFileHandle("data/ui.png", FileType.Internal), TextureFilter.Linear,\r
                                TextureFilter.Linear, TextureWrap.ClampToEdge, TextureWrap.ClampToEdge);\r
 \r
                        badlogic = Gdx.graphics.newTexture(Gdx.files.getFileHandle("data/badlogic.jpg", FileType.Internal),\r
-                               TextureFilter.MipMap, TextureFilter.Linear, TextureWrap.ClampToEdge, TextureWrap.ClampToEdge);\r
+                               TextureFilter.MipMap, TextureFilter.Linear, TextureWrap.ClampToEdge, TextureWrap.ClampToEdge);                          \r
 \r
                        ui = new Stage(480, 320, false);\r
                        atlas = new TextureAtlas(uiTexture);\r
@@ -80,7 +87,18 @@ public class UITest implements GdxTest, InputListener {
 \r
                        Button button = new Button("button", atlas.getRegion("button"), atlas.getRegion("buttonDown"));\r
                        button.action(Forever.$(RotateBy.$(360, 4)));\r
-                       ui.addActor(button);\r
+                       button.clickListener = new ClickListener() {\r
+                               \r
+                               @Override public void clicked (Button button) {\r
+                                       if( Gdx.input.supportsOnscreenKeyboard() )\r
+                                               Gdx.input.setOnscreenKeyboardVisible( true );\r
+                               }\r
+                       };\r
+                       ui.addActor(button);                    \r
+                       \r
+                       Label label = new Label( "label", font, "text input: " );\r
+                       label.x = 10; label.y = Gdx.graphics.getHeight() - 20;\r
+                       ui.addActor(label);\r
 \r
                        LinearGroup linear = new LinearGroup("linear", 64, 32 * 3, LinearGroupLayout.Vertical);\r
                        linear.x = 200;\r
@@ -131,7 +149,13 @@ public class UITest implements GdxTest, InputListener {
        }\r
 \r
        @Override public boolean keyTyped (char character) {\r
-               // TODO Auto-generated method stub\r
+               Label label = ((Label)ui.findActor( "label" ));\r
+               if( character == '\b' ) {\r
+                       if( label.text.length() > "text input: ".length() )\r
+                               label.text = label.text.substring( 0, label.text.length()-1 ); \r
+               } else {                        \r
+                       label.text += character;\r
+               }\r
                return false;\r
        }\r
 \r