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şimde bulunur. 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 edin, Tuş metni girişi onayı ve medya uygulamalarında boşluk çubuğu oynatma/duraklatma
  • Uygun durumlarda standart klavye kısayolları ekleyin. Örneğin, geri almak için Ctrl + Z, kaydetmek için Ctrl + S
  • İçerik menüsü için sağ tıklama, fareyle üzerine gelindiğinde simge değişikliklerini ve özel görünümlerde fare tekerleği veya dokunmatik yüzey kaydırma etkinliklerini kullanarak temel fare etkileşimlerini test edin.
  • Uygulamaları çizmek için ekran kalemi, oyunlar için oyun denetleyicileri ve müzik uygulamaları için MIDI denetleyiciler gibi uygulamaya özgü giriş cihazlarını test edin.
  • Uygulamanın masaüstü ortamlarında öne çıkmasını sağlayabilecek gelişmiş giriş desteğinden yararlanabilirsiniz. Örneğin, DJ uygulamaları için geçiş gücü olarak dokunmatik alan, oyunlar için fare yakalama ve klavye odaklı kullanıcılar için kapsamlı klavye kısayolları

Klavye

Uygulamanızın klavye girişlerine 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 odaklı uygulamalarda nadiren uygulanır ancak kullanıcılar bir uygulama kullanırken ve ellerini klavyeye tutarken bunu bekler. Ayrıca telefon, tablet, katlanabilir cihaz ve masaüstü cihazlarda erişilebilirlik gereksinimleri olan kullanıcılar için de gerekli olabilir.

Birçok uygulama için sadece ok tuşu ve sekmeyle kolayca gezinmeniz gerekir ve bunlar çoğunlukla Android çerçevesi tarafından otomatik olarak işlenir. Örneğin, varsayılan olarak Button görünümüne 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 biçiminde yapılabilir. Daha fazla bilgi için Odaklanma Yönetimi bölümünü inceleyin.

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, odaklanılabilir tüm görünümler için konumlarına göre gezinme eşlemesi oluşturur. Bu işlem genellikle beklendiği gibi çalışır ve başka bir işlem yapılması gerekmez. Varsayılan eşleme, bir uygulamanın ihtiyaçlarına göre doğru olmadığında 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);

Her sürümden önce yalnızca klavyeyi kullanarak uygulamanızın tüm işlevlerine erişmeye çalışmak iyi bir uygulamadır. En yaygın işlemlere fare veya dokunmatik giriş gerekmeden kolayca erişilebilmelidir.

Unutmayın, erişilebilirlik gereksinimleri olan kullanıcılar için klavye desteği gerekli olabilir.

Tuş vuruşları

EditText gibi bir ekran sanal klavyesi (IME) tarafından işlenecek metin girişleri için uygulamalar, geliştiricinin ek bir 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ı için uygulamaların bu davranışı kendilerinin yönetmesi gerekir. Bu, özellikle özel görünüme 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 bunlara örnek verilebilir.

Çoğu uygulama aşağıda gösterildiği gibi, onKeyUp() geri çağırmasını geçersiz kılar ve alınan her anahtar kodu için beklenen davranışı 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 yöntemi, bir anahtar basılı tutulursa veya yavaşça serbest bırakılırsa uygulamaların birden fazla onKeyDown etkinliğini işlemesini önler. Bir tuşa basıldığı anı öğrenmek isteyen veya kullanıcıların klavye tuşlarını basılı tutmasını bekleyen oyun ve uygulamalar, onKeyDown() etkinliğini arayıp tekrarlanan onKeyDown etkinliklerini kendileri işleyebilir.

Klavye desteği sağlama hakkında daha fazla bilgi için Klavye işlemlerini işleme bölümüne bakın.

Kısayollar

Donanım klavyesi kullanırken sık kullanılan Ctrl, Alt ve Üst Karakter tabanlı kısayolların olması beklenir. Uygulamalarda bu özellikler eklenmezse deneyim kullanıcılara hayal kırıklığı yaratabilir. İleri düzey kullanıcılar, sık kullanılan, uygulamaya özel görevler için kısayollardan da memnun olurlar. 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) kısayolları yaygın olarak kullanılan bazı kısayollar arasındadı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 tuş kodu için tüm meta tuş kombinasyonlarını (Alt, Ctrl ve Üst Karakter) engeller. Belirli bir meta anahtarı kontrol etmek için KeyEvent.isCtrlPressed(), KeyEvent.isShiftPressed(), KeyEvent.isAltPressed() veya KeyEvent.hasModifiers() kullanın.

Kısayol kodunun diğer tuş vuruşu işlemlerinden (onKeyUp() ve onKeyDown() gibi) ayrılması, kod bakımını kolaylaştırabilir ve her durumda meta anahtar kontrollerini manuel olarak uygulamak zorunda kalmadan meta tuşların 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 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);
}

KeyEvent.isCtrlPressed(), KeyEvent.isShiftPressed() veya KeyEvent.isAltPressed() öğelerini kontrol ederek yukarıdaki şekilde de kısayolları onKeyUp() ürününde de uygulayabilirsiniz. Meta davranış, bir kısayoldan ziyade bir uygulama davranışında yapılan bir değişiklik ise bunun sürdürülmesi daha kolay olabilir. Örneğin, W "ileri yürü", Ü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);
}

Ekran kalemi

Birçok büyük ekranlı cihazda ekran kalemi bulunur. Android uygulamaları bunu dokunmatik ekran girişi olarak işler. Bazı cihazlarda Wacom Intuos gibi USB veya Bluetooth çizim tablosu da bulunabilir. 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 bir MotionEvent.getSource() içerir.

MotionEvent, ek veriler de içerir:

Tarihi noktalar

Android, giriş etkinliklerini toplu olarak işler ve her karede bir kez yayınlar. Ekran kalemi, etkinlikleri ekrandan çok daha yüksek frekanslarda bildirebilir. Çizim uygulamaları oluştururken getHistorical API'lerini kullanarak yakın geçmişte olabilecek etkinlikleri kontrol etmek önemlidir:

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

Avuç içi reddi

Kullanıcılar ekran kalemi kullanarak çizim yaparken, yazarken veya uygulamanızla etkileşimde bulunurken bazen ekrana ellerinin avuçlarıyla dokunurlar. Sistem, yanlışlıkla avuç içi dokunmayı tanımadan ve dikkate almadan önce dokunma etkinliği (ACTION_DOWN veya ACTION_POINTER_DOWN olarak ayarlanmış) uygulamanıza bildirilebilir.

Android, avuç içi dokunma etkinliklerini iptal etmek için MotionEvent gönderir. Uygulamanız ACTION_CANCEL alırsa hareketi iptal edin. Uygulamanız ACTION_POINTER_UP alırsa FLAG_CANCELED'in ayarlanıp ayarlanmadığını kontrol edin. Bu durumda hareketi iptal edin.

Yalnızca FLAG_CANCELED öğesini kontrol etmeyin. Android 13'ten itibaren sistem, kolaylık sağlamak amacıyla ACTION_CANCEL etkinlikleri için FLAG_CANCELED özelliğini ayarlar ancak önceki sürümlerde bunu ayarlamaz.

Android 12

Android 12 (API düzeyi 32) ve önceki sürümlerde, avuç içi reddi yalnızca tek işaretçi dokunma etkinliklerinde tespit edilebilir. Tek işaretçi avuç içi dokunması ise sistem, hareket etkinliği nesnesinde ACTION_CANCEL özelliğini ayarlayarak etkinliği iptal eder. Diğer işaretçiler devre dışıysa sistem ACTION_POINTER_UP değerini ayarlar. Bu da avuç içi reddini algılamak için yeterli olmaz.

Android 13

Android 13 (API düzeyi 33) ve sonraki sürümlerde avuç içi dokunması tek işaretçiyse sistem, hareket etkinliği nesnesine ACTION_CANCEL ve FLAG_CANCELED ayarlayarak etkinliği iptal eder. Diğer işaretçiler devre dışı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 reddi (veya başka bir etkinlik iptali) gösterip göstermediğini belirlemek için FLAG_CANCELED olup olmadığını kontrol edin.

Not alma uygulamaları

ChromeOS, kayıtlı not alma uygulamalarını kullanıcılara 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ı bu uygulamayı 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ına sahip 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.

Ekran kalemi olmadan not alma amaçlarını test etme

Bir uygulamanın, etkin 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. --ash-enable-palette öğesini düzenlemek ve dosyanın sonundaki yeni bir satıra eklemek için i tuşlarına 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ıp tekrar giriş yap

Artık rafta bir ekran kalemi menüsü vardır:

  • 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ünü kaydet'i seçin veya bir resim indirin. Bildirimde "Görsele ek açıklama ekle" seçeneği bulunmalıdır. Bu işlem, uygulamayı resimle birlikte açıklama eklenmeye hazır olarak başlatır.

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ırak.

Sağ tıklama

Bir uygulamanın içerik menüsü göstermesini sağlayan 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. İçerik menüsü oluşturmayla ilgili ayrıntılar için İçeriğe Dayalı Menüler Oluşturma bölümüne bakın.

Kotlin

yourView.setOnContextClickListener {
  showContextMenu()
  true
}

Java

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

Üzerine gelme

Geliştiriciler, fareyle üzerine gelme etkinliklerini ele alarak uygulama düzenlerinin şık ve kullanımını kolaylaştırabilir. Bu durum özellikle özel görünümler için geçerlidir. Bunun en yaygın iki örneği aşağıda verilmiştir:

  • Bir öğenin tıklanabilir veya düzenlenebilir olma gibi etkileşimli davranışlara sahip olup olmadığını fare işaretçisi simgesini değiştirerek kullanıcılara bildirme
  • İşaretçi üzerlerine gelindiğinde büyük bir liste veya tablodaki öğ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

Çoklu pencere kullanılan bir ortamda, kullanıcılar uygulamalar arasında öğeleri sürükleyip bırakabilmeyi bekler. Bu durum, masaüstü cihazların yanı sıra tablet, telefon 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ır. Yaygın örneklerden bazıları şunlardır: Fotoğraf düzenleyicileri fotoğraf almayı, ses çalarları, ses dosyalarını ve çizim programlarını fotoğraf almayı bekleyebilirler.

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

ChromeOS ile ilgili özel noktalar

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

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

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

Gerekli davranışı uygulamak için MotionEvent politikasını inceleyin:

  • Hareket ACTION_HOVER_MOVE etkinlik oluşturur.
  • Düğmeler ACTION_BUTTON_PRESS ve ACTION_BUTTON_RELEASE etkinlikleri oluşturur. Tüm fare/dokunmatik yüzey düğmelerinin mevcut durumunu getButtonState() kullanarak da kontrol edebilirsiniz.
  • Fare tekerleğiyle kaydırma 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 kullanmak için standart Android oyun kumandası API'lerini kullanmalıdır (bkz. Oyun denetleyicilerini destekleme).

Düğmeler, ortak bir eşleme sonrasında ortak değerlerle eşlenir. Ne yazık ki tüm oyun kumandası üreticileri aynı harita oluşturma 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ılmaları işleme bölümüne bakın.

Çeviri modu girişi

ChromeOS, varsayılan olarak giriş çeviri modunu etkinleştirir. Çoğu Android uygulaması için bu mod, uygulamaların bir masaüstü ortamında beklendiği gibi çalışmasına yardımcı olur. Dokunmatik alanda iki parmakla kaydırmayı otomatik olarak etkinleştirme, fare tekerleğiyle kaydırma ve ham görüntüleme koordinatlarını pencere koordinatlarına eşleme, buna örnek olarak verilebilir. Genellikle uygulama geliştiricilerin bu davranışlardan herhangi birini kendilerinin uygulaması gerekmez.

Bir uygulama özel bir giriş davranışı uygularsa (ör. iki parmakla dokunmatik alanı sıkıştırma işlemi tanımlamak gibi) veya bu giriş çevirileri, uygulamanın beklediği giriş etkinliklerini sağlamazsa aşağıdaki etiketi Android manifest'e ekleyerek giriş çevirisi modunu devre dışı bırakabilirsiniz:

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

Ek kaynaklar