קלט של GameText חלק מ-Android Game Development Kit.

הספרייה GameTextInput היא חלופה פשוטה יותר ל-Android במסך מלא שמשתמשת מקלדת להזנת טקסט.

GameTextInput מספק API פשוט להצגה או להסתרה של הרכיב האינטראקטיבי במקלדת, להגדיר או לקבל את הטקסט שנערך עכשיו ולקבל התראות כאשר הטקסט השתנה. הוא לא מיועד לאפליקציות מתקדמות לעריכת טקסט, אבל עדיין מספק תמיכה בבחירה וכתיבת חיבור של אזור למקרי שימוש טיפוסיים משחקים. הספרייה הזו תומכת גם בעורך שיטות קלט מתקדם (IME), כמו איות- לבדוק, השלמות ותווים עם ריבוי מקשים.

באופן פנימי, GameTextInput צובר את טקסט הקלט (ביחד עם הרלוונטיים) למאגר הפנימי GameTextInput::currentState_, ומודיע באפליקציה של השינויים שבוצעו בה. לאחר מכן האפליקציה מבצעת עיבוד טקסט פונקציית קריאה חוזרת רשומה.

זמינות

ניתן להשתמש ב-GameTextInput בדרכים הבאות:

  • יחד עם GameActivity: GameActivity משלב את GameTextInput. אפליקציות שמשתמשות ב-GameActivity יכולות להשתמש רק קלט GameText. הוראות השימוש מתועדות במלואן בדף 'פעילות משחקים' . עבור לדוגמה של שילוב GameActivity ו-GameTextInput, ראו את למאגר לדוגמה של משחקים מודל השימוש הזה הוא לא נכללות במדריך זה.

  • כספרייה עצמאית: שאר המדריך מתאר את שלבי השימוש.

לתשומת ליבכם: שתי השיטות שמפורטות למעלה הן בלעדיות ואין חפיפה ביניהן.

גרסאות רשמיות של GameTextInput זמינות בערוצים הבאים:

המדריך הזה עוסק בתרחיש השימוש הראשון. כדי להשתמש בגרסאות של קובץ ZIP: לעיין בהוראות שנשלחות בתוך החבילה.

הגדרת ה-build

GameTextInput מופץ כארכיון Android (AAR). ה-AAR הזה מכיל את המחלקות Java את קוד המקור C, שמטמיע את התכונות המקוריות של GameTextInput. שלך תצטרכו לכלול את קובצי המקור האלה בתהליך ה-build שלכם, Prefab שחושף ספריות נייטיב וקוד מקור לפרויקט CMake או ל-NDK build.

  1. פועלים לפי ההוראות בקטע הדף Jetpack משחקים ב-Android כדי להוסיף את תלות של ספרייה אחת GameTextInput בקובץ build.gradle של המשחק. הערה שאם האפליקציות שלכם משתמשות ב-GameActivity, הן לא יכולות להשתמש הספריה GameTextInput הנפרדת.

  2. חשוב לוודא שהשדה gradle.properties מכיל את השורות הבאות:

    # Tell Android Studio we are using AndroidX.
    android.useAndroidX=true
    # Use Prefab 1.1.2 or higher, which contains a fix for "header only" libs.
    android.prefabVersion=1.1.2
    # Required only if you're using Android Studio 4.0 (4.1 is recommended).
    # android.enablePrefab=true
    
  3. מייבאים את החבילה game-text-input ומוסיפים אותה ליעד ב- קובץ CMakeLists.txt של הפרויקט:

    find_package(game-text-input REQUIRED CONFIG)
    ...
    target_link_libraries(... game-text-input::game-text-input)
    
  4. באחד מקובצי .cpp במשחק שלך, צריך להוסיף את השורה הבאה כדי לכלול אותה ההטמעה של GameTextInput:

    #include <game-text-input/gametextinput.cpp>
    
  5. בקובצי המקור שמשתמשים ב-GameTextInput C API, יש לכלול את הכותרת file:

    #include <game-text-input/gametextinput.h>
    
  6. הידור והפעלה של האפליקציה. אם יש שגיאות ב-CMake, יש לאמת את ה-AAR ואז build.gradle הקבצים מוגדרים כראוי. אם הקובץ #include הוא לא נמצא, יש לאמת את קובץ התצורה CMakeLists.txt.

שילוב ה-build

  1. מ-thread C שכבר מחובר ל-JVM, או מה-API הראשי של האפליקציה שרשור, שיחה GameTextInput_init עם מצביע JNIEnv.

    static GameTextInput* gameTextInput = nullptr;
    
    extern "C"
    JNIEXPORT void JNICALL
    Java_com_gametextinput_testbed_MainActivity_onCreated(JNIEnv* env,
      jobject this) {
    {
        if(!gameTextInput)
          gameTextInput = GameTextInput_init(env);
        ...
    }
    
  2. יצירת כיתת Java InputEnabledTextView עם גישה אל InputConnection.

    public class InputEnabledTextView extends View implements Listener {
      public InputConnection mInputConnection;
      public InputEnabledTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
      }
    
      public InputEnabledTextView(Context context) {
        super(context);
      }
      public void createInputConnection(int inputType) {
        EditorInfo editorInfo = new EditorInfo();
        editorInfo.inputType = inputType;
        editorInfo.actionId = IME_ACTION_NONE;
        editorInfo.imeOptions = IME_FLAG_NO_FULLSCREEN;
        mInputConnection = new InputConnection(this.getContext(), this,
                new Settings(editorInfo, true)
        ).setListener(this);
      }
    
      @Override
      public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
        if (outAttrs != null) {
            GameTextInput.copyEditorInfo(mInputConnection.getEditorInfo(), outAttrs);
        }
        return mInputConnection;
      }
    
      // Called when the IME input changes.
      @Override
      public void stateChanged(State newState, boolean dismissed) {
        onTextInputEventNative(newState);
      }
      @Override
      public void onImeInsetsChanged(Insets insets) {
        // handle Inset changes here
      }
    
      private native void onTextInputEventNative(State softKeyboardEvent);
    }
    
  3. צריך להוסיף את InputEnabledTextView שנוצר לפריסת ממשק המשתמש. לדוגמה, הקוד הבא ב-activity_main.xml יכול למקם אותו בתחתית המסך:

    <com.android.example.gametextinputjava.InputEnabledTextView
        android:id="@+id/input_enabled_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />
    
  4. מאחזרים את המחלקה החדשה הזו של InputEnabledTextView לפעילות ב-Java. הדבר פשוט יחסית כשמשתמשים בקישור תצוגה:

    public class MainActivity extends AppCompatActivity {
      ...
      private ActivityMainBinding binding;
      private InputEnabledTextView inputEnabledTextView;
    
      private native void setInputConnectionNative(InputConnection c);
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        ...
        binding = ActivityMainBinding.inflate(getLayoutInflater());
        inputEnabledTextView = binding.inputEnabledTextView;
        inputEnabledTextView.createInputConnection(InputType.TYPE_CLASS_TEXT);
        setInputConnectionNative(inputEnabledTextView.mInputConnection);
      }
    
  5. בספריית C, מעבירים את inputConnection אל GameTextInput_setInputConnection. העברת התקשרות חזרה בעוד GameTextInput_setEventCallback כדי לקבל התראות על אירועים כמבנה מצב C GameTextInputState.

    extern "C"JNIEXPORT void JNICALL
    Java_com_gametextinput_testbed_MainActivity_setInputConnectionNative(
      JNIEnv *env, jobject this, jobject inputConnection) {
      GameTextInput_setInputConnection(gameTextInput, inputConnection);
      GameTextInput_setEventCallback(gameTextInput,[](void *ctx, const GameTexgtInputState *state) {
        if (!env || !state) return;
        // process the newly arrived text input from user.
        __android_log_print(ANDROID_LOG_INFO, "TheGreateGameTextInput", state->text_UTF8);
      }, env);
    }
    
  6. בספריית C, GameTextInput_processEvent , שקוראת באופן פנימי לקריאה החוזרת שלכם שנרשמה בשלב הקודם, האפליקציה שלך כדי לטפל באירועים כשהמצב משתנה.

    extern "C"
    JNIEXPORT void JNICALL
    Java_com_gametextinput_testbed_InputEnabledTextView_onTextInputEventNative(
      JNIEnv* env, jobject this, jobject soft_keyboard_event) {
      GameTextInput_processEvent(gameTextInput, soft_keyboard_event);
    }
    

פונקציות עזר

הספרייה GameTextInput כוללת פונקציות עזר שמאפשרות להמיר בין אובייקטים של מצב Java לבין מבנים של מצב C. פונקציונליות גישה להצגה ולהסתיר את ה-IME דרך GameTextInput_showIme ו-GameTextInput_hideIme למשימות ספציפיות.

קובצי עזר

המידע הבא יעזור למפתחים ליצור אפליקציות GameTextInput:

משוב

אם יש בעיות או שאלות לגבי GameTextInput, אפשר ליצור כאן באג ב-Google IssueTracker.