อินพุตข้อความเกม เป็นส่วนหนึ่งของชุดเครื่องมือพัฒนาเกม Android

การใช้ไลบรารี GameTextInput เป็นวิธี ทางเลือกที่ง่ายกว่าในการเขียนแอป Android แบบเต็มหน้าจอที่ใช้ซอฟต์แวร์ แป้นพิมพ์สำหรับการป้อนข้อความ

GameTextInput มี API ที่ไม่ซับซ้อนเพื่อแสดงหรือซ่อนประเภทซอฟต์แวร์ แป้นพิมพ์ ตั้งค่าหรือรับข้อความที่แก้ไขอยู่ในปัจจุบัน และรับการแจ้งเตือนเมื่อ ข้อความจะเปลี่ยนไปแล้ว วิธีนี้ไม่ได้มีไว้สำหรับแอปเครื่องมือแก้ไขข้อความเต็มรูปแบบ แต่ ยังคงให้การสนับสนุนการเลือกและการเขียนภูมิภาคสำหรับกรณีการใช้งานทั่วไปใน เกม นอกจากนี้ ไลบรารีนี้รองรับเครื่องมือแก้ไขวิธีการป้อนข้อมูลขั้นสูง (IME) อย่างเช่น การสะกดคำ- การตรวจสอบ การเติมโค้ด และอักขระแบบหลายคีย์

จากภายใน GameTextInput จะรวบรวมอินพุตข้อความ (พร้อมกับ สถานะที่เกี่ยวข้อง) ไปยังบัฟเฟอร์ภายใน GameTextInput::currentState_ และแจ้ง เมื่อมีการเปลี่ยนแปลงใดๆ ในแอป จากนั้นแอปจะดำเนินการประมวลผลข้อความใน ฟังก์ชัน Callback ที่ลงทะเบียน

ความพร้อมใช้งาน

GameTextInput สามารถใช้ในลักษณะต่อไปนี้ได้

  • ใช้ร่วมกับ GameActivity: GameActivity จะผสานรวม GameTextInput ไว้ด้วย แอปพลิเคชันที่ใช้ GameActivity จะใช้ได้เฉพาะโหมดผสานรวม GameTextInput วิธีการใช้งานมีการบันทึกไว้ครบถ้วนเกี่ยวกับ หน้า GameActivity สำหรับ ตัวอย่างของการผสานรวม GameActivity และ GameTextInput ดูที่ ที่เก็บตัวอย่างเกม โมเดลการใช้งานนี้ ไม่อยู่ในขอบเขตของคู่มือนี้

  • เป็นไลบรารีแบบสแตนด์อโลน: ส่วนที่เหลือของคู่มือจะอธิบายขั้นตอนการใช้งาน

โปรดทราบว่าทั้ง 2 วิธีข้างต้นไม่สามารถใช้ร่วมกันได้

การเปิดตัว GameTextInput อย่างเป็นทางการพร้อมให้ใช้งานในช่องต่อไปนี้

คู่มือนี้ครอบคลุมกรณีการใช้งานแรก หากต้องการใช้การเผยแพร่ไฟล์ ZIP ให้ทำดังนี้ โปรดดูวิธีการที่จัดส่งภายในพัสดุ

ตั้งค่าบิลด์

GameTextInput ได้รับการเผยแพร่เป็น Android Archive (AAR) AAR นี้มีคลาส Java และ ซอร์สโค้ด C ซึ่งใช้ฟีเจอร์ดั้งเดิมของ GameTextInput คุณ ต้องรวมไฟล์ต้นฉบับเหล่านี้ไว้ในกระบวนการสร้างของคุณผ่านทาง Prefab ซึ่งแสดงไลบรารีที่มาพร้อมเครื่องและซอร์สโค้ดในโปรเจ็กต์ CMake หรือบิลด์ NDK

  1. ทำตามวิธีการใน Jetpack Android Games เพื่อเพิ่ม ทรัพยากร Dependency ของไลบรารี 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 ไฟล์:

    #include <game-text-input/gametextinput.h>
    
  6. คอมไพล์และเรียกใช้แอป หากคุณมีข้อผิดพลาด CMake ให้ตรวจสอบ AAR และ ไฟล์ build.gradle ได้รับการตั้งค่าอย่างถูกต้องแล้ว หากไฟล์ #include คือ ไม่พบ โปรดยืนยันไฟล์การกำหนดค่า CMakeLists.txt ของคุณ

ผสานรวมบิลด์

  1. จากชุดข้อความ 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);
        ...
    }
    
  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 ที่สร้างขึ้นลงในเลย์เอาต์ 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" />
    
  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 Issueเครื่องมือติดตาม