TextInput ใน GameActivity ส่วนหนึ่งของ Android Game Development Kit
GameActivity ผสานรวม GameTextInput โดยทำดังนี้
- การระบุ Wrapper
- สร้างฟีเจอร์สำหรับความพร้อมใช้งานของเหตุการณ์การป้อนข้อความใหม่
- ใช้บัฟเฟอร์สถานะของ GameTextInput โดยตรงสำหรับเนื้อหาข้อความ
ดังที่แสดงในแผนภาพต่อไปนี้ แอปพลิเคชันใช้คอมโพเนนต์เชิงตรรกะภายในที่แตกต่างกัน เพื่อวัตถุประสงค์ในการป้อนข้อความของผู้ใช้

การใช้GameTextInputไลบรารีในตัวมี 3 ขั้นตอนคร่าวๆ ดังนี้
- การควบคุมแป้นพิมพ์เสมือนใน UI
- ทราบเมื่อมีข้อความใหม่
- การดึงข้อความที่ผู้ใช้ป้อนและสถานะของข้อความ
ส่วนที่เหลือของเอกสารนี้จะอธิบายรายละเอียดเกี่ยวกับองค์ประกอบดังกล่าว ดูตัวอย่าง GameTextInput ที่มี GameActivity ได้ที่ ที่เก็บ games-samples
ควบคุมแป้นพิมพ์เสมือนใน UI
GameActivity มีฟังก์ชัน 2 อย่างเพื่อควบคุมแป้นพิมพ์เสมือนใน UI ดังนี้
GameActivity_showSoftInput()แสดงแป้นพิมพ์เสมือนGameActivity_hideSoftInput()ซ่อนแป้นพิมพ์เสมือน
โปรดดูคำจำกัดความของพารามิเตอร์ในเอกสารประกอบอ้างอิงของ API หลังจาก แป้นพิมพ์แสดงขึ้น UI ของแอปพลิเคชันอาจมีลักษณะคล้ายกับภาพต่อไปนี้

ตรวจสอบความพร้อมใช้งานของข้อความ
เหตุการณ์แป้นพิมพ์ซอฟต์แวร์จะส่งผ่านจาก GameTextInput ในฝั่ง Java ไปยังฝั่ง C/C++ ผ่าน JNI จากนั้นจะส่งต่อไปยัง Wrapper ของ GameActivity และสุดท้ายจะแสดงใน Flag android_app::textInputState ที่ติดตั้งใช้งานใน native_app_glue แอปพลิเคชัน ควรถามสถานะของแฟล็กนี้เป็นระยะๆ เพื่อทำการประมวลผลตามที่ต้องการ
- GameActivity จะตั้งค่าเฉพาะแฟล็ก
android_app::textInputState - แอปพลิเคชันจะสำรวจสถานะของ Flag และจัดการเหตุการณ์
GameTextInputใหม่ เช่น ข้อความใหม่ที่เพิ่มลงในบัฟเฟอร์อินพุต - แอปพลิเคชันจะล้าง
android_app::textInputState
โปรดทราบว่า android_app::textInputState ไม่ได้แยกความแตกต่างระหว่างเหตุการณ์การป้อนข้อความแบบครั้งเดียว และหลายครั้ง
ตัวอย่างง่ายๆ โค้ดต่อไปนี้จะสำรวจสถานะของtextInputStateหลังจาก จัดการคำสั่งวงจรแอป เหตุการณ์สัมผัส และเหตุการณ์คีย์
while (true) { // Read all pending events. int events; struct android_poll_source* source; while ((ALooper_pollOnce(engine.animating ? 0 : -1, nullptr, &events, (void**)&source)) >= 0) { // Process this event, etc. ... // Check if we are exiting. if (app->destroyRequested != 0) { engine_term_display(&engine); return; } } engine_handle_input(app); // Process text input events if there is any outstanding. if (app->textInputState) { // process TextInput events. ... //reset the textInputState flag app->textInputState = 0; } if (engine.animating) { // draw frames. } } ดึงข้อความที่ผู้ใช้ป้อน
ข้อความที่ป้อนและสถานะอื่นๆ จะสะสมอยู่ในบัฟเฟอร์ภายในของ GameTextInput GameTextInput::currentState_ แอปพลิเคชัน สามารถใช้วิธีใดวิธีหนึ่งต่อไปนี้เพื่อดึงเนื้อหา
- API Wrapper ของ GameActivity (แนะนำ)
- GameTextInput API
รับสถานะ TextInput ด้วย GameActivity API
แอปพลิเคชันจะรับอินพุตข้อความปัจจุบันด้วยกลไกการเรียกกลับทั่วไป
- ใช้ฟังก์ชันเรียกกลับประเภท
GameTextInputGetStateCallbackเพื่อประมวลผลเหตุการณ์การป้อนข้อความ - เรียกใช้
GameActivity_getInputState()เมื่อมีเหตุการณ์ที่ยังไม่ได้ดำเนินการอย่างน้อย 1 รายการ - ล้าง
android_app::textInputStateหลังจากประมวลผลเหตุการณ์แล้ว
โค้ดต่อไปนี้จะอ้างอิงบัฟเฟอร์การป้อนข้อความ ประมวลผล (ไม่ได้แสดง) และรีเซ็ตแฟล็กเหตุการณ์ โดยใช้ข้อมูลโค้ดในส่วนก่อนหน้า
extern "C" void GameTextInputGetStateCB(void *ctx, const struct GameTextInputState *state) { auto* engine = (struct engine*)ctx; if (!engine || !state) return; // Process the text event(s). LOGI("UserInputText: %s", state->text_UTF8); // Clear the text input flag. engine->app->textInputState = 0; } ในลูปเกมที่แสดงในส่วนก่อนหน้า ให้ตรวจสอบและประมวลผลข้อความ ด้วยตัวแฮนเดิลอินพุตข้อความด้านบน
if (state->textInputState) { GameActivity_getTextInputState( app->activity, GameTextInputGetStateCB, // App's event handler shown above. &engine // Context to the GameTextInputGetStateCB function. ); } แอปพลิเคชันจะเริ่มต้น GameTextInputState เนื้อหาด้วย GameActivity_setTextInputState() ก็ได้
รับสถานะ TextInput ด้วย GameTextInput API
นอกจากนี้ แอปพลิเคชันยังใช้ GameTextInput API โดยตรงเพื่อดึงข้อมูลปัจจุบัน GameTextInputState ได้ด้วย
- ใช้
GameActivity_getTextInput()เพื่อรับอินสแตนซ์GameTextInputภายในของ GameActivity - เมื่อมีอินสแตนซ์
GameTextInputอยู่ในมือ ให้เรียกใช้GameTextInput_getState()เพื่อรับเนื้อหาGameTextInputStateเดียวกัน
โปรดทราบอีกครั้งว่าแอปพลิเคชันไม่ควรเริ่มต้น GameTextInput โดยตรง เนื่องจาก GameActivity จะดำเนินการดังกล่าวอยู่แล้วในกระบวนการเริ่มต้น
กลไกการเรียกกลับจะเหมือนกับที่ใช้โดยฟังก์ชัน GameActivity_getTextInputState() ของ GameActivity
ข้อมูลอ้างอิง
นักพัฒนาแอปอาจพบว่าแหล่งข้อมูลต่อไปนี้มีประโยชน์เมื่อสร้าง GameActivityแอปพลิเคชัน
- เริ่มต้นใช้งาน GameActivity
- เอกสารประกอบสำหรับผู้ใช้ GameTextInput
- ตัวอย่าง agdkTunnel
- เอกสารอ้างอิง Jetpack สำหรับ GameActivity
- เอกสารประกอบข้อมูลอ้างอิง Jetpack สำหรับ GameTextInput
- ซอร์สโค้ด AGDK
ความคิดเห็น
ทั้ง GameActivity และ GameTextInput เป็นส่วนหนึ่งของไลบรารีเกม Jetpack หากพบปัญหาหรือมีคำถาม โปรดสร้างข้อบกพร่องใน IssueTracker ของ Google