Büyük ekranlarda giriş uyumluluğu

Büyük ekranlı cihazlarda kullanıcılar genellikle klavye, fare, dokunmatik alan, 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 işleme bölümüne bakın.
  • İleri seviye klavye desteğini test edin. Örneğin, Sekme tuşu ve ok tuşları ile klavyede gezinme, Enter tuşu ile 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 gibi temel fare etkileşimlerini test edin.
  • Dokunmatik kalem, oyun kumandaları ve müzik uygulaması MIDI kontrolörleri gibi uygulamaya özel giriş cihazlarını test edin.
  • Uygulamayı masaüstü ortamlarında öne çıkarabilecek ileri düzey giriş desteği sunabilirsiniz. Örneğin, DJ uygulamaları için geçiş düğmesi olarak dokunmatik yüzey, oyunlar için fare yakalama ve klavyeye 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.

Klavye gezinme özelliği, dokunmatik odaklı uygulamalarda nadiren uygulanır ancak kullanıcılar, bir uygulamayı kullanırken ellerini klavyede tuttuklarında bu özelliği bekler. Klavye gezinme, erişilebilirlik ihtiyaçları olan kullanıcılar için telefonlarda, tabletlerde, katlanabilir cihazlarda ve masaüstü cihazlarda önemli olabilir.

Ok tuşu ve Sekme tuşuyla gezinme, birçok uygulamada Android çerçevesi tarafından otomatik olarak yönetilir. Örneğin, Button varsayılan olarak odaklanılabilirdir ve klavye gezinme genellikle ek kod olmadan çalışmalıdır. Varsayılan olarak odaklanamayan görünümlerde klavyeyle gezinmeyi etkinleştirmek için bu görünümleri odaklanılabilir olarak işaretleyin. Bu işlem programatik olarak veya XML'de yapılabilir:

Kotlin

yourView.isFocusable = true

Java

yourView.setFocusable(true);

Alternatif olarak, focusable özelliğini sayfa düzeni dosyanızda da ayarlayabilirsiniz:

android:focusable="true"

Daha fazla bilgi için Odak İşleme başlıklı makaleyi inceleyin.

Odak etkinleştirildiğinde Android çerçevesi, odaklanılabilir 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ştirmeye gerek yoktur. Varsayılan eşleme bir uygulamanın ihtiyaçlarına uygun değilse eşleme 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 kullanıcı arayüzü öğesine erişimi yalnızca klavyeyi kullanarak test edin. Sık kullanılan öğelere fare veya dokunma girişi olmadan erişilebilmelidir.

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

Tuş vuruşları

Ekrandaki sanal klavye (IME) tarafından işlenecek metin girişleri (ör. EditText ) için uygulamalar, ek geliştirme çalışması gerektirmeden büyük ekranlı cihazlarda beklendiği gibi davranmalıdır. Çerçeve tarafından öngörülemeyen tuş vuruşları için uygulamaların bu davranışı kendileri yönetmesi 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ı, Boşluk tuşuyla oynatmayı başlatan ve durduran medya uygulamaları ve w, a, s ve d tuşlarıyla hareketi kontrol eden oyunlar bu tür uygulamalara örnek gösterilebilir.

Çoğu uygulama, onKeyUp() geri çağırma işlevini 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. Geri çağırma işlevi kullanıldığında, bir tuş basılı tutulursa veya yavaşça bırakılırsa uygulamaların birden fazla onKeyDown etkinliği işlemesi gerekmez. Bir tuşa basıldığı anı veya kullanıcının bir tuşa basılı tutup tutmadığını algılaması gereken oyunlar ve uygulamalar, onKeyDown etkinliğini dinleyebilir ve yinelenen onKeyDown etkinliklerini kendileri işleyebilir.

Daha fazla bilgi için Klavye işlemlerini işleme 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ı beklenir. Bir uygulamada kısayollar uygulanmazsa kullanıcılar can sıkıcı bir deneyim yaşayabilir. İleri düzey kullanıcılar, uygulamaya özgü sık kullanılan görevler için kısayollardan da yararlanır. Kısyollar, bir uygulamanın kullanımını kolaylaştırır ve uygulamayı kısayolu olmayan uygulamalardan ayı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 işleme bölümüne bakın.

Belirli bir tuş kodu için tüm tuş kombinasyonlarını (Alt, Ctrl, Üst Karakter ve Meta) engellemek üzere dispatchKeyShortcutEvent() uygulanarak kısayollar etkinleştirilebilir. Belirli bir değiştirici tuşunu kontrol etmek için:

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şlarının işlenmesinden ayırmak (ör. onKeyUp() ve onKeyDown()), değiştirici tuş kontrollerini her durumda manuel olarak uygulamak zorunda kalmadan değiştirici tuşları varsayılan olarak kabul eder. Tüm değiştirici tuş kombinasyonlarının kullanılmasına izin vermek, farklı klavye düzenlerine ve işletim sistemlerine alışkın kullanıcılar için de daha uygun olabilir.

Ancak KeyEvent.isCtrlPressed(), KeyEvent.isShiftPressed() veya KeyEvent.isAltPressed() değerini kontrol ederek onKeyUp()'te kısayollar da uygulayabilirsiniz. Değiştirilen anahtar davranışı, kısayoldan ziyade bir uygulama davranışında değişiklikse bu davranışı korumak daha kolay olabilir. Örneğin, oyunlarda W "ileri yürü", Üst Karakter+W ise "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ısayol yardımcısı başlıklı makaleyi de inceleyin.

Ekran kalemi

Birçok büyük ekranlı cihazda ekran kalemi bulunur. Android uygulamaları, ekran kalemlerini dokunmatik ekran girişi olarak işler. Bazı cihazlarda Wacom Intuos gibi USB veya Bluetooth çizim tableti de bulunabilir. Android uygulamaları Bluetooth girişi alabilir ancak USB girişi alamaz.

Dokunmatik kalem etkinliği, View#onTouchEvent() veya View#onGenericMotionEvent() tarafından dokunmatik ekran etkinliği olarak raporlanır ve SOURCE_STYLUS türüne sahip bir MotionEvent#getSource() içerir.

MotionEvent nesnesi etkinlikle ilgili bilgileri içerir:

Geçmiş puanlar

Android, giriş etkinliklerini gruplandırır ve çerçeve başına bir kez yayınlar. Dokunmatik kalem, etkinlikleri ekrandan çok daha yüksek sıklıklarda 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 çizim yaptığında, yazdığında veya uygulamanızla etkileşimde bulunduğunda bazen avuçlarıyla ekrana dokunur. Dokunma etkinliği (ACTION_DOWN veya ACTION_POINTER_DOWN olarak ayarlanır), sistem yanlışlıkla avuçla dokunmayı tanıyıp yoksayarmadan önce uygulamanıza bildirilebilir.

Android, MotionEvent göndererek avuç içi dokunma etkinliklerini iptal eder. Uygulamanız ACTION_CANCEL alırsa hareketi iptal edin. Uygulamanız ACTION_POINTER_UP alıyorsa FLAG_CANCELED 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 değerini ayarlar ancak sistem, bu işareti Android'in daha eski sürümlerinde ayarlamaz.

Android 12

Android 12 (API düzeyi 32) ve önceki sürümlerde avuç reddi yalnızca tek uçlu dokunma etkinlikleri için algılanabilir. Tek işaretçi avuç içi dokunuşsa sistem, hareket etkinliği nesnesinde ACTION_CANCEL değerini ayarlayarak etkinliği iptal eder. Diğer işaretçiler aşağıysa sistem ACTION_POINTER_UP değerini ayarlar. Bu değer, avuç reddi 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 dokunuşsa sistem, hareket etkinliği nesnesinde ACTION_CANCEL ve FLAG_CANCELED ayarlarını yaparak etkinliği iptal eder. Diğer işaretçiler aşağıysa sistem ACTION_POINTER_UP ve FLAG_CANCELED değerlerini ayarlar.

Uygulamanız ACTION_POINTER_UP içeren bir hareket etkinliği aldığında, etkinliğin avuç reddedilmesini (veya başka bir etkinlik iptalini) belirtip belirtmediğini belirlemek için FLAG_CANCELED değerini kontrol edin.

Not alma uygulamaları

ChromeOS'te, kayıtlı not alma uygulamalarını kullanıcılara gösteren özel bir intent vardır. Bir uygulamayı not alma uygulaması olarak kaydettirmek için uygulama manifest dosyanıza 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>

Sisteme kaydedilen bir uygulama, kullanıcı tarafından varsayılan not alma uygulaması olarak seçilebilir. Yeni bir not istendiğinde uygulama, ekran kalemi girişine hazır bir boş not oluşturmalıdır. Kullanıcı bir resme (ekran görüntüsü veya indirilen resim gibi) not eklemek istediğinde uygulama, content:// URI'leri içeren bir veya daha fazla öğe içeren ClipData ile açılır. Uygulama, ilk eklenen resmi arka plan resmi olarak kullanan bir not oluşturmalı ve kullanıcının ekranda ekran kalemi ile çizim yapabileceği bir moda girmelidir.

Ekran kalemi olmadan not alma intent'lerini test etme

[TBD remove section.]

Bir uygulamanın, etkin bir ekran kalemi olmadan not alma intent'lerine 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çip 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. Dosyanın sonundaki yeni bir satıra --ash-enable-palette eklemek ve düzenlemek 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. Oturumu kapatıp tekrar oturum açın

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ı yakala'yı seçin veya bir resim indirin. Bildirimde Resme not ekle seçeneği olmalıdır. Bu işlem, uygulamayı not eklenmeye hazır resimle başlatır.

Fare ve dokunmatik alan desteği

Çoğu uygulamanın genellikle büyük ekrana odaklanan yalnızca üç 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östermesine neden olan tüm işlemler (ör. bir liste öğesine dokunup basılı tutma) sağ tıklama etkinliklerine de tepki vermelidir.

Uygulamaların sağ tıklama etkinliklerini işleyebilmesi için View.OnContextClickListener kaydettirmesi gerekir:

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 ele alarak uygulama düzenlerinizin daha şık ve kullanımı daha kolay olmasını sağlayabilirsiniz. Bu durum özellikle özel görüntülemeler:

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 olma gibi etkileşimli bir davranışa sahip olup olmadığını belirtme
  • İşaretçi fareyle büyük bir liste veya ızgaradaki öğelerin üzerine geldiğinde görsel geri bildirim ekleme

Sürükleme ve bırakma

Kullanıcılar, çok pencereli bir ortamda öğeleri uygulamalar arasında 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üklemeyeceklerini düşünün. Örneğin, fotoğraf düzenleyenler fotoğraf, ses çalanlar ses dosyası, çizim programları ise fotoğraf almayı beklemelidir.

Sürükle ve bırak desteği eklemek için Sürükle ve bırak özelliğini etkinleştirme bölümüne bakın ve ChromeOS'te Android: Sürükle ve bırak özelliğini uygulama blog yayınını inceleyin.

ChromeOS ile ilgili özel 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 View#onGenericMotionEvent() ve SOURCE_MOUSE ile SOURCE_TOUCHSCREEN arasında ayrım yapmak için [MotionEvent.getSource()][] kullanın.

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

  • Hareket ACTION_HOVER_MOVE etkinliği oluşturur.
  • Düğmeler ACTION_BUTTON_PRESS ve ACTION_BUTTON_RELEASE etkinlikleri oluşturur. getButtonState() simgesini kullanarak tüm fare ve izleme paneli düğmelerinin mevcut durumunu da 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 denetleyicilerini işlemek için standart Android oyun denetleyicisi API'lerini kullanın (Oyun denetleyicilerini destekleme bölümüne bakın).

Oyun kontrol cihazı düğmeleri, ortak bir eşleme sonrasında ortak değerlerle eşlenir. Ancak tüm oyun kumandası üreticileri aynı eşleme kurallarına uymaz. Kullanıcıların popüler farklı kontrolör eşlemelerini seçmesine izin verirseniz ç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, varsayılan olarak giriş çevirisi 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. Dokunmatik yüzeyde iki parmakla kaydırma, fare tekerleğiyle kaydırma ve ham ekran koordinatlarını pencere koordinatlarıyla eşleme gibi özellikler otomatik olarak etkinleştirilebilir. Genellikle uygulama geliştiricilerin bu davranışlardan herhangi birini kendileri uygulaması gerekmez.

Bir uygulama, özel giriş davranışı (ör. özel iki parmak dokunmatik ekran sıkma işlemi tanımlama) 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