Büyük ekranlarda giriş uyumluluğu

Büyük ekranlı cihazlarda kullanıcılar genellikle klavye, fare, dokunmatik yüzey, ekran kalemi veya oyun kumandası kullanarak uygulamalarla etkileşim kurar. Uygulamanızın harici cihazlardan giriş kabul etmesini sağlamak için aşağıdakileri yapın:

  • Geri alma için Ctrl+Z, kopyalama için Ctrl+C ve kaydetme için Ctrl+S gibi temel klavye desteğini test edin. Varsayılan klavye kısayollarının listesi için Klavye işlemlerini yönetme başlıklı makaleyi inceleyin.
  • Gelişmiş klavye desteğini test edin. Örneğin, Sekme tuşu ve ok tuşlarıyla klavyede gezinme, Enter tuşuyla metin girişi onayı ve medya uygulamalarında Boşluk tuşu ile oynatma ve duraklatma.
  • Bağlam menüsü için sağ tıklama, fareyle üzerine gelindiğinde simge değişiklikleri ve özel bileşenlerde fare tekerleği veya dokunmatik yüzey kaydırma etkinlikleri dahil olmak üzere temel fare etkileşimlerini test edin.
  • Ekran kalemi, oyun kumandaları ve müzik uygulaması MIDI kumandaları gibi uygulamaya özel giriş cihazlarını test edin.
  • Uygulamanın masaüstü ortamlarında öne çıkmasını sağlayabilecek gelişmiş giriş desteğini göz önünde bulundurun. Örneğin, DJ uygulamaları için geçiş çubuğu olarak dokunmatik alan, oyunlar için fare yakalama ve klavye odaklı kullanıcılar için klavye kısayolları.

Klavye

Uygulamanızın klavye girişine yanıt verme şekli, büyük ekran kullanıcı deneyimine katkıda bulunur. Üç tür klavye girişi vardır: gezinme, tuş vuruşları ve kısayollar.

Klavyeyle gezinme, dokunmatik odaklı uygulamalarda nadiren uygulanır ancak kullanıcılar, bir uygulamayı kullanırken ve elleri klavyedeyken bu özelliği bekler. Klavyeyle gezinme; telefonlar, tabletler, katlanabilir cihazlar ve masaüstü cihazlarda erişilebilirlik ihtiyaçları olan kullanıcılar için çok önemli olabilir.

Birçok uygulamada ok tuşu ve sekme gezinme işlemleri Android çerçevesi tarafından otomatik olarak gerçekleştirilir. Örneğin, Button varsayılan olarak odaklanılabilir ve klavye ile gezinme genellikle ek kod olmadan çalışır. Varsayılan olarak odaklanılabilir olmayan görünümler için klavyeyle gezinmeyi etkinleştirmek istiyorsanız bunları odaklanılabilir olarak işaretleyin. Bu işlemi programatik olarak veya XML'de yapabilirsiniz:

Kotlin

yourView.isFocusable = true

Java

yourView.setFocusable(true);

Alternatif olarak, düzen dosyanızda focusable özelliğini ayarlayabilirsiniz:

android:focusable="true"

Daha fazla bilgi için Odak İşleme bölümüne bakın.

Odak etkinleştirildiğinde Android çerçevesi, odaklanabilir tüm görünümler için konumlarına göre bir gezinme eşlemesi oluşturur. Bu genellikle beklendiği gibi çalışır ve daha fazla geliştirme yapılması gerekmez. Varsayılan eşleme bir uygulamanın ihtiyaçları için doğru olmadığında eşleme aşağıdaki gibi geçersiz kılınabilir:

Kotlin

// Arrow keys
yourView.nextFocusLeftId = R.id.view_to_left
yourView.nextFocusRightId = R.id.view_to_right
yourView.nextFocusTopId = R.id.view_above
yourView.nextFocusBottomId = R.id.view_below
// Tab key
yourView.nextFocusForwardId = R.id.next_view

Java

// Arrow keys
yourView.setNextFocusLeftId(R.id.view_to_left);
yourView.setNextFocusRightId(R.id.view_to_left);
yourView.setNextFocusTopId(R.id.view_to_left);
yourView.setNextFocusBottomId(R.id.view_to_left);
// Tab key
yourView.setNextFocusForwardId(R.id.next_view);

Yalnızca klavyeyi kullanarak uygulamanızın her kullanıcı arayüzü öğesine erişimi test edin. Sık kullanılan öğelere fare veya dokunmatik giriş olmadan erişilebilmelidir.

Klavye desteğinin, erişilebilirlik ihtiyaçları olan kullanıcılar için gerekli olabileceğini unutmayın.

Tuş vuruşları

Ekrandaki sanal klavye (IME) tarafından işlenecek metin girişleri için (ör. EditText ) uygulamalar, ek geliştirme çalışması gerektirmeden büyük ekranlı cihazlarda beklendiği gibi davranmalıdır. Çerçeve tarafından tahmin edilemeyen tuş vuruşları için uygulamaların davranışı kendilerinin işlemesi gerekir. Bu durum özellikle özel görünümlere sahip uygulamalar için geçerlidir.

Mesaj göndermek için Enter tuşunu kullanan sohbet uygulamaları, oynatmayı başlatmak ve durdurmak için Boşluk tuşunu kullanan medya uygulamaları ve hareketi kontrol etmek için w, a, s ve d tuşlarını kullanan oyunlar buna örnek verilebilir.

Çoğu uygulama, onKeyUp() geri çağırma işlevini geçersiz kılar ve alınan her tuş kodu için beklenen davranışı ekler:

Kotlin

kotlin override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean { return when (keyCode) { KeyEvent.KEYCODE_ENTER -> { sendChatMessage() true } KeyEvent.KEYCODE_SPACE -> { playOrPauseMedia() true } else -> super.onKeyUp(keyCode, event) } }

Java

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_ENTER) {
        sendMessage();
        return true;
    } else if (KeyEvent.KEYCODE_SPACE){
        playOrPauseMedia();
        return true;
    } else {
        return super.onKeyUp(keyCode, event);
    }
}

Bir tuş bırakıldığında onKeyUp etkinliği gerçekleşir. Geri çağırma işlevinin kullanılması, bir tuş basılı tutulduğunda veya yavaşça bırakıldığında uygulamaların birden fazla onKeyDown etkinliğini işlemesini önler. Bir tuşa basıldığı anı veya kullanıcının bir tuşu basılı tutup tutmadığını algılaması gereken oyunlar ve uygulamalar, onKeyDown etkinliğini dinleyebilir ve tekrarlanan onKeyDown etkinliklerini kendileri işleyebilir.

Daha fazla bilgi için Klavye işlemlerini yönetme başlıklı makaleyi inceleyin.

Kısayollar

Donanım klavyesi kullanırken Ctrl, Alt, üst karakter ve Meta tuşlarını içeren yaygın klavye kısayollarının kullanılması beklenir. Bir uygulama kısayolları uygulamıyorsa deneyim kullanıcılar için can sıkıcı olabilir. İleri düzey kullanıcılar, sık kullanılan uygulamaya özel görevler için kısayolları da tercih eder. Kısayollar, uygulamanın kullanımını kolaylaştırır ve kısayolu olmayan uygulamalardan farklılaştırır.

Sık kullanılan kısayollardan bazıları Ctrl+S (kaydet), Ctrl+Z (geri al) ve Ctrl+Üst Karakter+Z (yeniden yap) şeklindedir. Varsayılan kısayolların listesi için Klavye işlemlerini yönetme başlıklı makaleyi inceleyin.

Kısayollar, belirli bir tuş kodu için tüm tuş kombinasyonlarını (Alt, Ctrl, üst karakter ve Meta) yakalamak üzere dispatchKeyShortcutEvent() uygulanarak etkinleştirilebilir. Belirli bir değiştirici tuşu kontrol etmek için şunu kullanın:

Kotlin

override fun dispatchKeyShortcutEvent(event: KeyEvent): Boolean {
  return when (event.keyCode) {
    KeyEvent.KEYCODE_O -> {
      openFile() // Ctrl+O, Shift+O, Alt+O
      true
    }
    KeyEvent.KEYCODE_Z-> {
      if (event.isCtrlPressed) {
        if (event.isShiftPressed) {
          redoLastAction() // Ctrl+Shift+Z pressed
          true
        } else {
          undoLastAction() // Ctrl+Z pressed
          true
        }
      }
    }
    else -> {
      return super.dispatchKeyShortcutEvent(event)
    }
  }
}

Java

@Override
public boolean dispatchKeyShortcutEvent(KeyEvent event) {
  if (event.getKeyCode() == KeyEvent.KEYCODE_O) {
      openFile(); // Ctrl+O, Shift+O, Alt+O
      return true;
  } else if(event.getKeyCode() == KeyEvent.KEYCODE_Z) {
      if (event.isCtrlPressed()) {
          if (event.isShiftPressed()) {
              redoLastAction();
              return true;
          }
          else {
              undoLastAction();
              return true;
          }
      }
  }
  return super.dispatchKeyShortcutEvent(event);
}

Kısayol kodunu diğer tuş vuruşu işlemlerinden (ör. onKeyUp() ve onKeyDown()) ayırmak, her durumda değiştirici tuş kontrollerini manuel olarak uygulamak zorunda kalmadan değiştirici tuşları varsayılan olarak kabul eder. Tüm değiştirici tuş kombinasyonlarına izin vermek, farklı klavye düzenlerine ve işletim sistemlerine alışkın olan kullanıcılar için de daha kolay olabilir.

Ancak KeyEvent.isCtrlPressed(), KeyEvent.isShiftPressed() veya KeyEvent.isAltPressed() için kontrol yaparak onKeyUp() içinde kısayollar da uygulayabilirsiniz. Değiştirilen tuş davranışı bir kısayoldan ziyade uygulama davranışında yapılan bir değişiklikse bu yöntemin bakımı daha kolay olabilir. Örneğin, oyunlarda W "ileri yürü" ve Üst Karakter+W "ileri koş" anlamına gelir.

Kotlin

override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
  return when(keyCode) {
    KeyEvent.KEYCODE_W-> {
      if (event.isShiftPressed) {
        if (event.isCtrlPressed) {
          flyForward() // Ctrl+Shift+W pressed
          true
        } else {
          runForward() // Shift+W pressed
          true
        }
      } else {
        walkForward() // W pressed
        true
      }
    }
    else -> super.onKeyUp(keyCode, event)
  }
}

Java

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_W) {
        if (event.isShiftPressed()) {
            if (event.isCtrlPressed()) {
                flyForward(); // Ctrl+Shift+W pressed
                return true;
            } else {
                runForward(); // Shift+W pressed
                return true;
            }
        } else {
            walkForward();
            return true;
        }
    }
    return super.onKeyUp(keyCode, event);
}

Klavye Kısayolları Yardımcısı'na da göz atın.

Ekran kalemi

Büyük ekranlı cihazların çoğu ekran kalemiyle birlikte gelir. Android uygulamaları, ekran kalemlerini dokunmatik ekran girişi olarak işler. Bazı cihazlarda Wacom Intuos gibi USB veya Bluetooth çizim tableti de olabilir. Android uygulamaları Bluetooth girişini alabilir ancak USB girişini alamaz.

Ekran kalemi etkinliği, View#onTouchEvent() veya View#onGenericMotionEvent() tarafından dokunmatik ekran etkinliği olarak bildirilir ve SOURCE_STYLUS türünde bir MotionEvent#getSource() içerir.

MotionEvent nesnesi, etkinlikle ilgili bilgileri içerir:

Tarihi noktalar

Android, giriş etkinliklerini toplu olarak işler ve kare başına bir kez yayınlar. Ekrandan çok daha yüksek frekanslarda etkinlik bildirebilir. Çizim uygulamaları oluştururken getHistorical API'lerini kullanarak yakın geçmişte gerçekleşmiş olabilecek etkinlikleri kontrol edin:

Avuç içi reddi

Kullanıcılar ekran kalemi kullanarak uygulamanızda çizim yaparken, yazı yazarken veya uygulamanızla etkileşim kurarken bazen avuç içleriyle ekrana dokunurlar. Sistem, yanlışlıkla yapılan avuç içi dokunmayı tanıyıp yok saymadan önce dokunma etkinliği (ACTION_DOWN veya ACTION_POINTER_DOWN olarak ayarlanır) uygulamanıza bildirilebilir.

Android, bir MotionEvent göndererek avuç içi dokunma etkinliklerini iptal eder. Uygulamanız ACTION_CANCEL alırsa hareketi iptal edin. Uygulamanız ACTION_POINTER_UP hatası alıyorsa FLAG_CANCELED değerinin ayarlanıp ayarlanmadığını kontrol edin. Bu durumda hareketi iptal edin.

Yalnızca FLAG_CANCELED için kontrol etmeyin. Android 13 (API düzeyi 33) ve sonraki sürümlerde sistem, ACTION_CANCEL etkinlikleri için FLAG_CANCELED işaretini ayarlar ancak daha eski Android sürümlerinde bu işareti ayarlamaz.

Android 12

Android 12 (API düzeyi 32) ve önceki sürümlerde avuç içi reddetme algılaması yalnızca tek işaretçili dokunma etkinlikleri için mümkündür. Avuç içi dokunma tek işaretçiyse sistem, hareket etkinliği nesnesinde ACTION_CANCEL değerini ayarlayarak etkinliği iptal eder. Başka işaretçiler basılıysa sistem ACTION_POINTER_UP değerini ayarlar. Bu değer, avuç içi reddini algılamak için yeterli değildir.

Android 13

Android 13 (API düzeyi 33) ve sonraki sürümlerde, tek işaretçi avuç içi dokunma ise sistem, hareket etkinliği nesnesinde ACTION_CANCEL ve FLAG_CANCELED değerlerini ayarlayarak etkinliği iptal eder. Başka işaretçiler basılıysa sistem ACTION_POINTER_UP ve FLAG_CANCELED değerlerini ayarlar.

Uygulamanız ACTION_POINTER_UP ile bir hareket etkinliği aldığında, etkinliğin avuç içi reddini (veya diğer etkinlik iptallerini) gösterip göstermediğini belirlemek için FLAG_CANCELED olup olmadığını kontrol edin.

Not alma uygulamaları

ChromeOS'te, kayıtlı not alma uygulamalarını kullanıcılara gösteren özel bir intent bulunur. Bir uygulamayı not alma uygulaması olarak kaydetmek için uygulama manifestinize aşağıdakileri ekleyin:

<intent-filter>
    <action android:name="org.chromium.arc.intent.action.CREATE_NOTE" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

Bir uygulama sisteme kaydedildiğinde kullanıcı, uygulamayı varsayılan not alma uygulaması olarak seçebilir. Yeni bir not istendiğinde uygulama, ekran kalemi girişine hazır boş bir not oluşturmalıdır. Kullanıcı bir resme (ör. ekran görüntüsü veya indirilen resim) ek açıklama eklemek istediğinde uygulama, content:// URI'leri içeren bir veya daha fazla öğe barındıran ClipData ile başlatılır. Uygulama, ekli ilk resmi arka plan resmi olarak kullanan bir not oluşturmalı ve kullanıcının ekran üzerinde ekran kalemiyle çizim yapabileceği bir moda girmelidir.

Not alma amaçlarını ekran kalemi olmadan test etme

Bir uygulamanın, etkin bir ekran kalemi olmadan not alma amaçlarına doğru şekilde yanıt verip vermediğini test etmek için ChromeOS'te not alma seçeneklerini görüntülemek üzere aşağıdaki yöntemi kullanın:

  1. Geliştirici moduna geçme ve cihazı yazılabilir hale getirme
  2. Terminal açmak için Ctrl+Alt+F2 tuşlarına basın.
  3. sudo vi /etc/chrome_dev.conf komutunu çalıştırın.
  4. Dosyayı düzenlemek ve sonuna yeni bir satır olarak --ash-enable-palette eklemek için i tuşuna basın.
  5. Esc tuşuna basıp :, w, q yazarak ve Enter tuşuna basarak kaydedin.
  6. Normal ChromeOS kullanıcı arayüzüne dönmek için Ctrl+Alt+F1 tuşlarına basın.
  7. Çıkış yapıp tekrar giriş yapma

Artık rafta bir ekran kalemi menüsü görünür:

  • Raftaki ekran kalemi düğmesine dokunup Yeni not'u seçin. Bu işlem, boş bir çizim notu açar.
  • Ekran görüntüsü alın. Raftan ekran kalemi düğmesi > Ekran görüntüsü al'ı seçin veya bir resim indirin. Bildirimde Resme not ekle seçeneği olmalıdır. Bu işlem, uygulamayı resimle birlikte başlatır ve resim, ek açıklama eklenmeye hazır hale gelir.

Fare ve dokunmatik alan desteği

Çoğu uygulamanın genellikle büyük ekran odaklı yalnızca üç etkinliği işlemesi gerekir: sağ tıklama, fareyle üzerine gelme ve sürükle ve bırak.

Sağ tıklama

Uygulamanın bağlam menüsü göstermesine neden olan tüm işlemler (ör. bir liste öğesine dokunup basılı tutma), sağ tıklama etkinliklerine de yanıt vermelidir.

Uygulamalar, sağ tıklama etkinliklerini işlemek için bir View.OnContextClickListener kaydetmelidir:

Kotlin

yourView.setOnContextClickListener {
    showContextMenu()
    true
}

Java

yourView.setOnContextClickListener(v -> {
    showContextMenu();
    return true;
});

Bağlam menüleri oluşturma hakkında ayrıntılı bilgi için Bağlam menüsü oluşturma başlıklı makaleyi inceleyin.

İmleçle üzerine gelin

Fareyle üzerine gelme etkinliklerini işleyerek uygulama düzenlerinizi daha şık ve kullanımı daha kolay hale getirebilirsiniz. Bu durum özellikle özel görüntüleme:

Kotlin

// Change the icon to a "hand" pointer on hover.
// Highlight the view by changing the background.
yourView.setOnHoverListener { view, _ ->
    addVisualHighlighting(true)
    view.pointerIcon =
        PointerIcon.getSystemIcon(view.context, PointerIcon.TYPE_HAND)
    true // Listener consumes the event.
}

Java

// Change the icon to a "hand" pointer on hover.
// Highlight the view by changing the background.
yourView.setOnHoverListener((view, event) -> {
    addVisualHighlighting(true);
    view.setPointerIcon(
        PointerIcon.getSystemIcon(view.getContext(), PointerIcon.TYPE_HAND)
    );
    return true; // Listener consumes the event.
});

Bunun en yaygın iki örneği şunlardır:

  • Fare işaretçisi simgesini değiştirerek kullanıcılara bir öğenin tıklanabilir veya düzenlenebilir gibi etkileşimli davranışları olup olmadığını gösterme
  • İşaretçi, büyük bir liste veya ızgaradaki öğelerin üzerine geldiğinde bu öğelere görsel geri bildirim ekleme

Sürükleme ve bırakma

Çok pencereli bir ortamda kullanıcılar, uygulamalar arasında öğeleri sürükleyip bırakabilmeyi bekler. Bu durum masaüstü cihazların yanı sıra bölünmüş ekran modundaki tabletler, telefonlar ve katlanabilir cihazlar için de geçerlidir.

Kullanıcıların uygulamanıza öğe sürükleyip sürüklemeyeceğini düşünün. Örneğin, fotoğraf düzenleyicilerin fotoğraf, ses çalarların ses dosyası ve çizim programlarının fotoğraf alması beklenir.

Sürükle ve bırak desteği eklemek için Sürükle ve bırak özelliğini etkinleştirme bölümlerini inceleyin ve Android on ChromeOS — Implementing Drag & Drop (ChromeOS'te Android - Sürükle ve Bırak Özelliğini Uygulama) başlıklı blog yayınına göz atın.

ChromeOS ile ilgili dikkat edilmesi gereken noktalar

Gelişmiş işaretçi desteği

Fare ve dokunmatik alan girişini gelişmiş şekilde işleyen uygulamalar, PointerEvent elde etmek için bir View#onGenericMotionEvent() ve SOURCE_MOUSE ile SOURCE_TOUCHSCREEN arasındaki farkı belirtmek için [MotionEvent.getSource()][] kullanın.

Gerekli davranışı uygulamak için MotionEvent nesnesini inceleyin:

  • Hareket, ACTION_HOVER_MOVE etkinlik oluşturur.
  • Düğmeler ACTION_BUTTON_PRESS ve ACTION_BUTTON_RELEASE etkinlikleri oluşturur. Ayrıca, getButtonState() kullanarak tüm fare ve dokunmatik yüzey düğmelerinin mevcut durumunu kontrol edebilirsiniz.
  • Fare tekerleğiyle kaydırma, ACTION_SCROLL etkinlikleri oluşturur.

Oyun kumandaları

Bazı büyük ekranlı Android cihazlar, dört adede kadar oyun kumandasını destekler. Oyun kumandalarını yönetmek için standart Android oyun kumandası API'lerini kullanın (Oyun kumandalarını destekleme bölümüne bakın).

Oyun kumandası düğmeleri, ortak bir eşlemeyi izleyen ortak değerlerle eşlenir. Ancak tüm oyun kumandası üreticileri aynı eşleme kurallarına uymaz. Kullanıcıların farklı popüler kumanda eşlemelerini seçmesine izin vererek çok daha iyi bir deneyim sunabilirsiniz. Daha fazla bilgi için Oyun kumandası düğmelerine basma işlemlerini işleme başlıklı makaleyi inceleyin.

Giriş çeviri modu

ChromeOS'te giriş çeviri modu varsayılan olarak etkindir. Bu mod, çoğu Android uygulamasının masaüstü ortamında beklendiği gibi çalışmasına yardımcı olur. Dokunmatik alanda iki parmakla kaydırmayı, fare tekerleğiyle kaydırmayı ve ham ekran koordinatlarını pencere koordinatlarıyla eşlemeyi otomatik olarak etkinleştirme, bu duruma örnek olarak verilebilir. Genellikle uygulama geliştiricilerin bu davranışların hiçbirini kendilerinin uygulaması gerekmez.

Bir uygulama özel giriş davranışı uyguluyorsa (örneğin, özel bir iki parmakla dokunmatik alan sıkıştırma işlemi tanımlıyorsa) veya bu giriş çevirileri uygulama tarafından beklenen giriş etkinliklerini sağlamıyorsa Android manifest dosyasına aşağıdaki etiketi ekleyerek giriş çeviri modunu devre dışı bırakabilirsiniz:

<uses-feature
    android:name="android.hardware.type.pc"
    android:required="false" />

Ek kaynaklar