GameTextInput Android Game Development Kit'in bir parçasıdır.

GameTextInput kitaplığını kullanmak, metin girişi için yumuşak klavye kullanan tam ekran Android uygulaması yazmaya daha basit bir alternatiftir.

GameTextInput, yazılım klavyesini göstermek veya gizlemek, o anda düzenlenmiş metni ayarlamak veya almak ve metin değiştirildiğinde bildirim almak için basit bir API sunar. Bu özellik, tam donanımlı metin düzenleyici uygulamaları için tasarlanmamıştır ancak oyunların tipik kullanım alanları için bölge seçme ve oluşturma desteği sunar. Ayrıca bu kitaplık; yazım denetimi, tamamlamalar ve çok tuşlu karakterler gibi gelişmiş giriş yöntemi düzenleyici (IME) özelliklerini de destekler.

GameTextInput, dahili olarak, giriş metnini (ilgili durumlarla birlikte) GameTextInput::currentState_ dahili arabelleğinde toplar ve uygulamayı bu tür değişiklikler konusunda bilgilendirir. Ardından uygulama, kayıtlı geri çağırma işlevinde metin işlemeyi gerçekleştirir.

Kullanılabilirlik

GameTextInput aşağıdaki şekillerde kullanılabilir:

  • GameActivity ile birlikte: GameActivity, GameTextInput'u entegre eder. GameActivity kullanan uygulamalar yalnızca entegre GameTextInput'u kullanabilir. Kullanım talimatları GameActivity sayfasında eksiksiz olarak belgelenmiştir. GameActivity ve GameTextInput entegrasyonu örneği için games-samples deposuna bakın. Bu kullanım modeli, bu kılavuzun kapsamında değildir.

  • Bağımsız bir kitaplık olarak: Kılavuzun geri kalanında kullanım adımları açıklanmıştır.

Yukarıdaki iki yöntemin karşılıklı olarak birbirini dışladığını unutmayın.

Resmi GameTextInput sürümleri aşağıdaki kanallarda sunulmaktadır:

Bu kılavuzda ilk kullanım alanı ele alınmaktadır. Zip dosya sürümlerini kullanmak için, paketin içinde gönderilen talimatlara bakın.

Derlemenizi ayarlama

GameTextInput, Android Arşivi (AAR) olarak dağıtılmıştır. Bu AAR, Java sınıflarını ve GameTextInput yerel özelliklerini uygulayan C kaynak kodunu içerir. Bu kaynak dosyaları, CMake projenize veya NDK derlemenize yerel kitaplıkları ve kaynak kodu sunan Prefab aracılığıyla derleme sürecinize eklemeniz gerekir.

  1. GameTextInput kitaplığı bağımlılığını oyununuzun build.gradle dosyasına eklemek için Jetpack Android Games sayfasındaki talimatları uygulayın. GameActivity kullanıyorsanız uygulamalarınız bağımsız GameTextInput kitaplığını kullanamazlar.

  2. gradle.properties alanında aşağıdaki satırları bulunduğundan emin olun:

    # 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 paketini içe aktarın ve projenizin CMakeLists.txt dosyasındaki hedefinize ekleyin:

    find_package(game-text-input REQUIRED CONFIG)
    ...
    target_link_libraries(... game-text-input::game-text-input)
    
  4. Oyununuzdaki .cpp dosyalarından birine, aşağıdaki satırı GameTextInput uygulamasını içerecek şekilde ekleyin:

    #include <game-text-input/gametextinput.cpp>
    
  5. GameTextInput C API'yi kullanan kaynak dosyalara başlık dosyasını ekleyin:

    #include <game-text-input/gametextinput.h>
    
  6. Uygulamayı derleyip çalıştırın. CMake hataları varsa AAR ve build.gradle dosyalarının düzgün şekilde ayarlandığını doğrulayın. #include dosyası bulunamazsa CMakeLists.txt yapılandırma dosyanızı doğrulayın.

Derlemenizi entegre edin

  1. JVM'ye veya uygulama ana iş parçacığına zaten bağlı olan C iş parçacığınızdan JNIEnv işaretçisiyle GameTextInput_init çağrısı yapın.

    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. InputConnection erişimi olan bir InputEnabledTextView Java sınıfı oluşturun.

    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. Oluşturulan InputEnabledTextView öğesini kullanıcı arayüzü düzenine ekleyin. Örneğin, activity_main.xml yerel ayarında aşağıdaki kod bunu ekranın alt kısmına yerleştirebilir:

    <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. Bu yeni InputEnabledTextView sınıfını Java etkinliğinize alın. Görünüm Bağlama'yı kullandığınızda bu işlemi yapmak nispeten basittir:

    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 kitaplığınızda inputConnection değerini GameTextInput_setInputConnection hesabına geçirin. Etkinliklerle ilgili bildirim almak için C state struct GameTextInputState olarak GameTextInput_setEventCallback içinde geri arama iletin.

    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 kitaplığınızda GameTextInput_processEvent yöntemini çağırın. Bu çağrı, durum değiştiğinde uygulamanızın etkinlikleri işlemesi için önceki adımda kaydedilen geri çağırma işlemini dahili olarak çağırır.

    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);
    }
    

Yardımcı işlevler

GameTextInput kitaplığı, Java durumu nesneleri ile C durumu struct'ları arasında dönüşüm yapmanızı sağlayan yardımcı program işlevleri içerir. GameTextInput_showIme ve GameTextInput_hideIme işlevleri aracılığıyla IME'yi gösterme ve gizleme işlevine erişin.

Referanslar

Geliştiriciler GameTextInput ile uygulama oluştururken aşağıdakiler yararlı olabilir:

Geri bildirim

GameTextInput ile ilgili sorularınız ve sorunlarınız için Google IssueTracker'da hata kaydı oluşturun.