อินพุตข้อความเกม เป็นส่วนหนึ่งของชุดเครื่องมือพัฒนาเกม Android
การใช้ไลบรารี GameTextInput
เป็นวิธี
ทางเลือกที่ง่ายกว่าในการเขียนแอป Android แบบเต็มหน้าจอที่ใช้ซอฟต์แวร์
แป้นพิมพ์สำหรับการป้อนข้อความ
GameTextInput
มี API ที่ไม่ซับซ้อนเพื่อแสดงหรือซ่อนประเภทซอฟต์แวร์
แป้นพิมพ์ ตั้งค่าหรือรับข้อความที่แก้ไขอยู่ในปัจจุบัน และรับการแจ้งเตือนเมื่อ
ข้อความจะเปลี่ยนไปแล้ว วิธีนี้ไม่ได้มีไว้สำหรับแอปเครื่องมือแก้ไขข้อความเต็มรูปแบบ แต่
ยังคงให้การสนับสนุนการเลือกและการเขียนภูมิภาคสำหรับกรณีการใช้งานทั่วไปใน
เกม นอกจากนี้ ไลบรารีนี้รองรับเครื่องมือแก้ไขวิธีการป้อนข้อมูลขั้นสูง
(IME) อย่างเช่น การสะกดคำ-
การตรวจสอบ การเติมโค้ด
และอักขระแบบหลายคีย์
จากภายใน GameTextInput
จะรวบรวมอินพุตข้อความ (พร้อมกับ
สถานะที่เกี่ยวข้อง) ไปยังบัฟเฟอร์ภายใน GameTextInput::currentState_
และแจ้ง
เมื่อมีการเปลี่ยนแปลงใดๆ ในแอป จากนั้นแอปจะดำเนินการประมวลผลข้อความใน
ฟังก์ชัน Callback ที่ลงทะเบียน
ความพร้อมใช้งาน
GameTextInput
สามารถใช้ในลักษณะต่อไปนี้ได้
ใช้ร่วมกับ GameActivity: GameActivity จะผสานรวม GameTextInput ไว้ด้วย แอปพลิเคชันที่ใช้ GameActivity จะใช้ได้เฉพาะโหมดผสานรวม GameTextInput วิธีการใช้งานมีการบันทึกไว้ครบถ้วนเกี่ยวกับ หน้า GameActivity สำหรับ ตัวอย่างของการผสานรวม GameActivity และ GameTextInput ดูที่ ที่เก็บตัวอย่างเกม โมเดลการใช้งานนี้ ไม่อยู่ในขอบเขตของคู่มือนี้
เป็นไลบรารีแบบสแตนด์อโลน: ส่วนที่เหลือของคู่มือจะอธิบายขั้นตอนการใช้งาน
โปรดทราบว่าทั้ง 2 วิธีข้างต้นไม่สามารถใช้ร่วมกันได้
การเปิดตัว GameTextInput
อย่างเป็นทางการพร้อมให้ใช้งานในช่องต่อไปนี้
- ไลบรารีเกม Jetpack เปิดตัวใน Google Maven
- การเผยแพร่ไฟล์ ZIP ในหน้าดาวน์โหลด AGDK
คู่มือนี้ครอบคลุมกรณีการใช้งานแรก หากต้องการใช้การเผยแพร่ไฟล์ ZIP ให้ทำดังนี้ โปรดดูวิธีการที่จัดส่งภายในพัสดุ
ตั้งค่าบิลด์
GameTextInput
ได้รับการเผยแพร่เป็น Android Archive (AAR) AAR นี้มีคลาส Java และ
ซอร์สโค้ด C ซึ่งใช้ฟีเจอร์ดั้งเดิมของ GameTextInput
คุณ
ต้องรวมไฟล์ต้นฉบับเหล่านี้ไว้ในกระบวนการสร้างของคุณผ่านทาง
Prefab
ซึ่งแสดงไลบรารีที่มาพร้อมเครื่องและซอร์สโค้ดในโปรเจ็กต์ CMake หรือบิลด์ NDK
ทำตามวิธีการใน Jetpack Android Games เพื่อเพิ่ม ทรัพยากร Dependency ของไลบรารี
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
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); }
เพิ่ม
InputEnabledTextView
ที่สร้างขึ้นลงในเลย์เอาต์ UI ตัวอย่างเช่น พารามิเตอร์ โค้ดต่อไปนี้ใน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 นี่คือ อย่างง่ายเมื่อคุณใช้ดูการเชื่อมโยง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
โทรกลับใน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 Issueเครื่องมือติดตาม