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

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

GameTextInput, dokunmatik klavyeyi göstermek veya gizlemek, düzenlenmekte olan metni ayarlamak veya almak ve metin değiştirildiğinde bildirim almak için basit bir API sağlar. Bu, tam teşekküllü metin düzenleyici uygulamaları için tasarlanmasa da oyunlardaki tipik kullanım alanları için seçim ve oluşturma bölgesi desteği sağlar. Ayrıca bu kitaplık; yazım denetimi, tamamlamalar ve çok tuşlu karakterler gibi gelişmiş giriş yöntemi düzenleyici (IME) özelliklerini destekler.

GameTextInput, dahili olarak giriş metnini (ilgili durumlarıyla birlikte) dahili arabelleğe GameTextInput::currentState_ toplar ve uygulamayı içindeki değişikliklerden haberdar eder. 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'i entegre eder. GameActivity kullanan uygulamalar yalnızca entegre GameTextInput'i kullanabilir. Kullanım talimatları GameActivity sayfasında eksiksiz olarak açıklanmıştır. GameActivity ve GameTextInput entegrasyonunun örneği için games-samples deposuna bakın. Bu kullanım modeli bu kılavuzun kapsamında değildir.

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

Yukarıdaki iki yöntemin birbirini hariç tuttuğunu unutmayın.

Resmi GameTextInput sürümleri, [Google Maven][google-maven]{:.external}'deki Jetpack oyun kitaplığı sürümünde mevcuttur.

Derlemenizi ayarlama

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

  1. GameTextInput kitaplık bağımlılığını oyununuzun build.gradle dosyasına eklemek için Jetpack Android Games sayfasındaki talimatları uygulayın. Uygulamalarınız GameActivity kullanıyorsa bağımsız GameTextInput kitaplığını kullanılamayacağını unutmayın.

  2. gradle.properties dosyasının aşağıdaki satırları içerdiğinden 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ında hedefinize ekleyin:

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

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

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

Derlemenizi entegre etme

  1. JVM'ye bağlı C iş parçacınızdan veya uygulamanın ana iş parçacısında JNIEnv işaretçisiyle GameTextInput_init işlevini çağırı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'e 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 içindeki aşağıdaki kod, activity_main.xml öğesini 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üntü Bağlama'yı kullandığınızda bu işlem 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 içine aktarın. C durum yapısı GameTextInputState olarak etkinliklerden haberdar olmak için GameTextInput_setEventCallback içinde bir geri çağırma işlevi 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, önceki adımda kaydettiğiniz geri çağırma işlevini dahili olarak çağıran GameTextInput_processEvent işlevini çağırarak uygulamanızın durum değiştiğinde etkinlikleri işlemesini sağlayın.

    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 durum nesneleri ile C durum yapıları arasında dönüştürme yapmanıza olanak tanıyan yardımcı işlevler 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ğıdakileri faydalı bulabilir:

Geri bildirim

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