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