GameTextInput חלק מ-Android Game Development Kit.
השימוש בספרייה GameTextInput
הוא חלופה פשוטה יותר לכתיבת אפליקציית Android למסך מלא שמשתמשת במקלדת הוירטואלית להזנת טקסט.
GameTextInput
מספק API פשוט להצגה או להסתרה של המקלדת הרכה, להגדרה או לקבלת הטקסט שנערך כרגע ולקבלת התראות כשהטקסט משתנה. התכונה הזו לא מיועדת לאפליקציות עריכת טקסט מלאות, אבל היא עדיין מספקת תמיכה באזור בחירה ובאזור כתיבה לתרחישי שימוש טיפוסיים במשחקים. בנוסף, הספרייה הזו תומכת בתכונות מתקדמות של עורך שיטות קלט (IME), כמו בדיקת איות, השלמות ותווים עם כמה מקשים.
באופן פנימי, GameTextInput
צובר את טקסט הקלט (יחד עם המצבים הרלוונטיים) במאגר הפנימי GameTextInput::currentState_
ומודיע לאפליקציה על כל שינוי שמתרחש בו. לאחר מכן האפליקציה מבצעת עיבוד טקסט בפונקציית הקריאה החוזרת הרשומה שלה.
זמינות
אפשר להשתמש ב-GameTextInput
בדרכים הבאות:
יחד עם GameActivity: GameActivity משלב את GameTextInput. באפליקציות שמשתמשות ב-GameActivity אפשר להשתמש רק ב-GameTextInput המשולב. הוראות השימוש מתועדות באופן מלא בדף GameActivity . דוגמה לשילוב של GameActivity ו-GameTextInput זמינה במאגר games-samples. מודל השימוש הזה לא נכלל במדריך הזה.
כספרייה עצמאית: שאר המדריך מתאר את שלבי השימוש.
חשוב לזכור שאי אפשר להשתמש בשתי השיטות שצוינו למעלה בו-זמנית.
גרסאות רשמיות של Jetpack זמינות בספריית המשחקים של Jetpack
בגרסה [Google Maven][google-maven]{:.external}.GameTextInput
הגדרת ה-build
GameTextInput
מופץ כארכיון Android (AAR). קובץ ה-AAR הזה מכיל את מחלקות Java ואת קוד המקור של C, שמטמיע את התכונות המקוריות של GameTextInput
. צריך לכלול את קובצי המקור האלה כחלק מתהליך הבנייה באמצעות Prefab
, שחושף ספריות Native וקוד מקור לפרויקט CMake או ל-NDK build.
פועלים לפי ההוראות בדף Jetpack Android Games כדי להוסיף את התלות בספרייה
GameTextInput
לקובץbuild.gradle
של המשחק. הערה: אם האפליקציות שלכם משתמשות ב-GameActivity, אי אפשר להשתמש בספרייתGameTextInput
העצמאית.מוודאים שהקובץ
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
מייבאים את חבילת
game-text-input
ומוסיפים אותה ליעד בקובץCMakeLists.txt
של הפרויקט:find_package(game-text-input REQUIRED CONFIG) ... target_link_libraries(... game-text-input::game-text-input)
באחד מקובצי
.cpp
במשחק, מוסיפים את השורה הבאה כדי לכלול את ההטמעה שלGameTextInput
:#include <game-text-input/gametextinput.cpp>
בקובצי המקור שמשתמשים ב-
GameTextInput
C API, צריך לכלול את קובץ הכותרת:#include <game-text-input/gametextinput.h>
קומפלו את האפליקציה והריצו אותה. אם יש שגיאות ב-CMake, ודאו שהקבצים AAR ו-
build.gradle
מוגדרים בצורה תקינה. אם הקובץ#include
לא נמצא, צריך לאמת את קובץ ההגדרותCMakeLists.txt
.
שילוב של הגרסה
משרשור C שכבר מצורף ל-JVM, או מהשרשור הראשי של האפליקציה, קוראים ל-
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); ... }
יוצרים מחלקת Java עם גישה ל-
InputConnection
.InputEnabledTextView
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); }
מוסיפים את
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" />
מאחזרים את המחלקה החדשה
InputEnabledTextView
לפעילות Java. הפעולה הזו פשוטה יחסית כשמשתמשים ב-View Binding: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); }
בספריית C, מעבירים את
inputConnection
אלGameTextInput_setInputConnection
. מעבירים קריאה חוזרת (callback) ב-GameTextInput_setEventCallback
כדי לקבל התראה על אירועים כמבנה מצב CGameTextInputState
.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); }
בספריית 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
- שימוש ב-GameTextInput עם GameActivity
- מסמך ��זר בנושא GameTextInput
- קוד המקור של GameTextInput
משוב
אם יש לך בעיות או שאלות לגבי GameTextInput
, אפשר ליצור באג ב-Google IssueTracker.