Büyük ekranlarda giriş uyumluluğu

Büyük ekranlı cihazlarda, kullanıcılar uygulamalarla daha sık etkileşime geçmek için klavye, fare, dokunmatik yüzey, ekran kalemi veya oyun kumandası kullanırlar. Uygulamanızın harici cihazlardan gelen girişleri kabul etmesini sağlamak için aşağıdakileri yapın:

  • Sekme ve ok tuşu klavyeyle gezinme gibi temel klavye desteğini test etme, Medya uygulamalarında tuş metin girişi onayını girme ve Boşluk tuşuyla oynatma/duraklatma
  • Uygun durumlarda standart klavye kısayolları ekleyin. Örneğin, geri almak için Ctrl + Z ve kaydetmek için Ctrl + S
  • Özel görünümlerde içerik menüsü için sağ tıklama, fareyle üzerine gelindiğinde simge değişiklikleri ve fare tekerleği veya dokunmatik yüzey kaydırma etkinlikleri aracılığıyla temel fare etkileşimlerini test edin
  • Çizim uygulamaları için ekran kalemi, oyunlar için oyun kumandaları ve müzik uygulamaları için 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 değerlendirin. Örneğin, DJ uygulamaları için çapraz geçiş yapmak üzere dokunmatik alan, oyunlar için fare yakalama ve klavyeye odaklanan kullanıcılar için kapsamlı klavye kısayolları

Klavye

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

Klavyeyle gezinme, dokunma merkezli uygulamalarda nadiren uygulanır ancak kullanıcılar bir uygulama kullanırken ve ellerini klavyeye koyduklarında bunu beklerler. Ayrıca telefon, tablet, katlanabilir cihaz ve masaüstü cihazlarda erişilebilirlik ihtiyaçları olan kullanıcılar için de son derece önemli olabilir.

Birçok uygulama için gereken tek şey basit ok tuşu ve sekmede gezinmektir. Bu işlem çoğunlukla Android yapısı tarafından otomatik olarak işlenir. Örneğin, bir Button görünümüne varsayılan olarak odaklanılabilir ve klavyeyle gezinme genellikle ek kod olmadan çalışır. Varsayılan olarak odaklanılamayan görünümlerde klavyeyle gezinmeyi etkinleştirmek için geliştiriciler bunları odaklanılabilir olarak işaretlemelidir. Bu işlem aşağıda gösterildiği gibi programatik olarak veya XML olarak yapılabilir. Daha fazla bilgi için Odaklanma İşleme bölümüne bakın.

Kotlin

yourView.isFocusable = true

Java

yourView.setFocusable(true);

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

android:focusable="true"

Odak etkinleştirildikten sonra Android çerçevesi, tüm odaklanılabilir görünümler için konumlarına göre bir gezinme eşlemesi oluşturur. Bu genellikle beklendiği gibi çalışır ve başka bir işlem yapmanız gerekmez. Varsayılan eşleme bir uygulamanın ihtiyaçları için doğru değilse aşağıdaki şekilde 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);

Uygulamanızın her işlevine her sürümden önce yalnızca klavyeyi kullanarak erişmeye çalışmak iyi bir uygulamadır. En yaygın işlemlere fare veya dokunma girişi olmadan kolayca erişilebilmelidir.

Erişilebilirlik ihtiyaçları olan kullanıcılar için klavye desteğinin çok önemli olabileceğini unutmayın.

Tuş vuruşları

EditText gibi ekrandaki bir sanal klavye (IME) tarafından işlenecek metin girişleri için uygulamalar, geliştiricinin herhangi bir ek işlem yapmasına gerek kalmadan büyük ekranlı cihazlarda beklendiği gibi davranmalıdır. Çerçeve tarafından tahmin edilemeyen tuş vuruşlarını uygulamaların kendilerinin yönetmesi gerekir. Bu, özellikle özel görünümlere sahip uygulamalar için geçerlidir.

Mesaj göndermek için Enter tuşunu kullanan sohbet uygulamaları, boşluk tuşuyla oynatmayı başlatıp durduran medya uygulamaları ve w, a, s ve d tuşlarıyla hareketi kontrol eden oyunlar buna örnek olarak verilebilir.

Çoğu uygulama onKeyUp() geri çağırmasını geçersiz kılar ve alınan her anahtar kodu için beklenen davranışı aşağıda gösterildiği gibi ekler:

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 anahtar serbest bırakıldığında onKeyUp etkinliği gerçekleşir. Bu geri çağırma, bir anahtarın basılı tutulması veya yavaş bir şekilde bırakılması halinde uygulamaların birden fazla onKeyDown etkinliğini işlemesini önler. Bir tuşa basıldığı anda bilmek isteyen veya kullanıcıların klavye tuşlarını basılı tutmasını bekleyen oyunlar ve uygulamalar, onKeyDown() etkinliğini arayabilir ve tekrarlanan onKeyDown etkinliklerini kendileri işleyebilir.

Klavye desteği sağlama hakkında daha fazla bilgi için Klavye işlemlerini işleme konusuna bakın.

Kısayollar

Donanım klavyesi kullanılırken yaygın olarak kullanılan Ctrl, Alt ve Üst Karakter tabanlı kısayollar beklenir. Uygulama bunları yapmazsa kullanıcı deneyimi sinir bozucu olabilir. İleri düzey kullanıcılar, uygulamaya özgü sık kullanılan görevlerin kısayollarını da takdir ederler. Kısayollar, bir uygulamanın kullanımını kolaylaştırır ve kısayolu olmayan uygulamalardan ayırt edilmesini sağlar.

Ctrl + S (kaydet), Ctrl + Z (geri al) ve Ctrl + Üst Karakter + Z (yeniden yap) gibi sık kullanılan kısayollardan bazılarıdır. Daha gelişmiş bazı kısayollar için VLC Media Player kısayol tuşları listesine bakın.

Kısayollar, dispatchKeyShortcutEvent() kullanılarak uygulanabilir. Bu, belirli bir anahtar kodu için tüm meta tuş kombinasyonlarını (Alt, Ctrl ve Üst Karakter) keser. Belirli bir meta anahtar olup olmadığını kontrol etmek için KeyEvent.isCtrlPressed(), KeyEvent.isShiftPressed(), KeyEvent.isAltPressed() veya KeyEvent.hasModifiers() kullanın.

Kısayol kodunu diğer tuş vuruşu işlemlerinden (ör. onKeyUp() ve onKeyDown()) ayırmak, kod bakımını kolaylaştırabilir ve her durumda manuel olarak meta anahtar kontrolleri uygulamak zorunda kalmadan meta anahtarları varsayılan olarak kabul edilmesini sağlar. Tüm meta tuş kombinasyonlarına izin vermek, farklı klavye düzenlerine ve işletim sistemlerine alışkın olan kullanıcılar için de daha kullanışlı olabilir.

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

Yukarıdakiyle aynı şekilde KeyEvent.isCtrlPressed(), KeyEvent.isShiftPressed() veya KeyEvent.isAltPressed() öğelerini kontrol ederek onKeyUp() içinde de kısayollar uygulayabilirsiniz. Meta davranış, kısayoldan ziyade uygulama davranışında yapılan bir değişiklik ise bunu sağlamak daha kolay olabilir. Örneğin, W "ileri gitmek" ve Üst Karakter + W "ileri koş" anlamına geldiğinde.

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

Ekran kalemi

Büyük ekranlı cihazların çoğunda ekran kalemi bulunur. Android uygulamaları bunu dokunmatik ekran girişi olarak kullanır. Bazı cihazlarda Wacom Intuos gibi bir USB veya Bluetooth çizim tablosu da olabilir. Android uygulamaları Bluetooth girişi alabilir, ancak USB girişiyle çalışmaz.

Ekran kalemi etkinliği, View.onTouchEvent() veya View.onGenericMotionEvent() aracılığıyla dokunmatik ekran etkinliği olarak raporlanır ve SOURCE_STYLUS türünde MotionEvent.getSource() içerir.

MotionEvent, ek veriler de içerecek:

Geçmiş puanlar

Android, giriş etkinliklerini toplu hale getirir ve kare başına bir kez gönderir. Ekran kalemi, etkinlikleri ekrandan çok daha yüksek sıklıkta raporlayabilir. Çizim uygulamaları oluştururken getHistorical API'lerini kullanarak yakın zamanda gerçekleşmiş olabilecek etkinlikleri kontrol etmek önemlidir:

  • MotionEvent.getHistoricalX()
  • MotionEvent.getHistoricalY()
  • MotionEvent.getHistoricalPressure()
  • MotionEvent.getHistoricalAxisValue()

Avuç içi reddi

Kullanıcılar ekran kalemi kullanarak çizerken, yazarken veya uygulamanızla etkileşimde bulunurken bazen avuçlarıyla ekrana dokunurlar. Dokunma etkinliği (ACTION_DOWN veya ACTION_POINTER_DOWN olarak ayarlanmış) sistem, yanlışlıkla avuç içi dokunuşunu tanıyıp dikkate almadan uygulamanıza bildirilebilir.

Android, avuç içi dokunma etkinliklerini bir MotionEvent göndererek iptal eder. Uygulamanız ACTION_CANCEL alırsa hareketi iptal edin. Uygulamanızda ACTION_POINTER_UP kullanılıyorsa FLAG_CANCELED'in ayarlanıp ayarlanmadığını kontrol edin. Öyleyse hareketi iptal edin.

Yalnızca FLAG_CANCELED için kontrol etmeyin. Android 13'ten itibaren sistem, ACTION_CANCEL etkinlikleri için FLAG_CANCELED özelliğini ayarlamaktadır ancak önceki sürümlerde bunu ayarlamamaktadır.

Android 12

Android 12 (API düzeyi 32) ve önceki sürümlerde avuç içi reddinin algılanması yalnızca tek noktalı dokunma etkinliklerinde mümkündür. Tek işaretçi avuç içine dokunmaysa sistem, hareket etkinliği nesnesine ACTION_CANCEL değerini ayarlayarak etkinliği iptal eder. Diğer işaretçiler hatalıysa sistem ACTION_POINTER_UP değerini ayarlar. Bu, avuç içi reddinin algılanması için yeterli değildir.

Android 13

Android 13 (API düzeyi 33) ve sonraki sürümlerde, tek işaretçi avuç içine dokunmaksa sistem, hareket etkinliği nesnesinde ACTION_CANCEL ve FLAG_CANCELED öğelerini ayarlayarak etkinliği iptal eder. Diğer işaretçiler çalışmıyorsa sistem, ACTION_POINTER_UP ve FLAG_CANCELED öğelerini ayarlar.

Uygulamanız ACTION_POINTER_UP ile bir hareket etkinliği aldığında, etkinliğin avuç içi reddi (veya başka bir etkinlik iptali) gösterip göstermediğini belirlemek için FLAG_CANCELED özelliğini kontrol edin.

Not alma uygulamaları

ChromeOS, kullanıcılara kayıtlı not alma uygulamalarını gösteren özel bir amaca sahiptir. Bir uygulamayı not alma uygulaması olarak kaydetmek için aşağıdaki kodu Android manifest dosyasına ekleyin:

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

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

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

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

  1. Geliştirici moduna geçin ve cihazı yazılabilir hale getirin
  2. Bir 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. --ash-enable-palette öğesini düzenlemek ve dosyanın sonundaki yeni bir satıra eklemek için i tuşuna basın
  5. Esc tuşuna basıp :, w, q yazıp 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ın ve tekrar giriş yapın

Artık rafta bir ekran kalemi menüsü bulunur:

  • Raftaki ekran kalemi düğmesine dokunun ve Yeni not'u seçin. Boş bir çizim notu açılır.
  • 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 "Resimlere ek açıklama ekle" seçeneği olacaktır. Uygulama, ek açıklama eklenmeye hazır bir şekilde başlar.

Fare ve dokunmatik alan desteği

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

Sağ tıklama

Bir uygulamanın içerik menüsü göstermesine neden olan tüm işlemler (ör. bir liste öğesine dokunup basılı tutma) sağ tıklama etkinliklerine de tepki vermelidir. Sağ tıklama etkinliklerini işlemek için uygulamaların bir View.OnContextClickListener kaydetmesi gerekir. Bağlam menüsü oluşturmayla ilgili ayrıntılar için Bağlamsal Menüler Oluşturma bölümüne bakın.

Kotlin

yourView.setOnContextClickListener {
  showContextMenu()
  true
}

Java

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

İmleçle üzerine gelin

Geliştiriciler, fareyle üzerine gelme etkinliklerinden yararlanarak uygulama düzenlerini şık ve kullanımı kolay hale getirebilir. Bu durum özellikle özel görünümler için geçerlidir. Bunun en yaygın iki örneği şunlardır:

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

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)
  false // listener did not consume the event.
}

Java

yourView.setOnHoverListener((view, event) -> {
    addVisualHighlighting(true);
    view.setPointerIcon(PointerIcon
            .getSystemIcon(view.getContext(), PointerIcon.TYPE_HAND));
    return true;
});

Sürükleyin ve bırakın

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

Geliştiriciler, kullanıcıların uygulamalarına öğe sürükleme ihtimalinin olup olmadığını dikkate almalıdırlar. Yaygın örneklerden bazıları şunlardır: Fotoğraf düzenleyicileri fotoğraf, ses çalarlar ve çizim programları fotoğraf almayı beklemelidir.

Sürükleyip bırakma desteği eklemek için Android Sürükle ve bırak dokümanlarındaki talimatları uygulayın ve bu ChromeOS blog yayınına göz atın.

ChromeOS ile ilgili özel noktalar

  • Uygulamanın dışından sürüklenen öğelere erişmek için requestDragAndDropPermissions üzerinden izin istemeyi unutmayın.
  • Bir öğenin diğer uygulamalara sürüklenebilmesi için View.DRAG_FLAG_GLOBAL işaretinin olması gerekir

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

Fare ve dokunmatik alan girişlerini gelişmiş şekilde işleyen uygulamalar View.onGenericMotionEvent() ile ilgili Android dokümanlarına uymalı ve SOURCE_MOUSE ile SOURCE_TOUCHSCREEN birbirinden ayırt etmek için MotionEvent.getSource() kullanmalıdır.

Gerekli davranışı uygulamak için MotionEvent 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/dokunmatik alan düğmelerinin mevcut durumunu kontrol edebilirsiniz.
  • Fare tekerleği kaydırması ACTION_SCROLL etkinlik oluşturur.

Oyun kumandaları

Bazı büyük ekranlı Android cihazlar dört adede kadar oyun kumandasını destekler. Geliştiriciler, bu API'leri işlemek için standart Android oyun kumandası API'lerini kullanmalıdır (Oyun kumandalarını destekleme bölümüne bakın).

Düğmeler, ortak bir eşlemenin ardından ortak değerlerle eşlenir. Maalesef tüm oyun kumandası üreticileri aynı eşleme kurallarını uygulamamaktadır. Kullanıcıların farklı popüler kumanda eşlemeleri seçmesine izin verirseniz çok daha iyi bir deneyim sunabilirsiniz. Daha fazla bilgi için Oyun kumandası düğmesine basılanları işleme bölümüne bakın.

Giriş çeviri modu

ChromeOS, varsayılan olarak giriş çeviri modunu etkinleştirir. Çoğu Android uygulaması için bu mod, uygulamaların masaüstü ortamında beklendiği gibi çalışmasına yardımcı olur. Buna örnek olarak dokunmatik alanda iki parmakla kaydırmanın otomatik olarak etkinleştirilmesi, fare tekerleğiyle kaydırma ve ham ekran koordinatlarının pencere koordinatlarıyla eşlenmesi verilebilir. Genel olarak, uygulama geliştiricilerin bu davranışlardan hiçbirini kendilerinin uygulaması gerekmez.

Bir uygulama, özel iki parmakla dokunmatik alan sıkıştırma işlemi tanımlamak gibi özel giriş davranışı uyguluyorsa veya bu giriş çevirileri uygulamanın beklediği giriş etkinliklerini sağlamıyorsa Android manifest dosyasına aşağıdaki etiketi ekleyerek giriş çevirisi modunu devre dışı bırakabilirsiniz:

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

Ek kaynaklar