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.

Birçok uygulamada ok tuşu ve Sekme tuşu gezinme işlemleri Android çerçevesi tarafından otomatik olarak yönetilir. Örneğin, bazı kompozisyonlar varsayılan olarak odaklanılabilirdir (ör. Button veya clickable değiştiricisine sahip bir kompozisyon). Klavye gezinme genellikle ek kod olmadan çalışır. Varsayılan olarak odaklanamayan özel kompozisyonlar için klavye gezinmesini etkinleştirmek üzere focusable değiştiricisini ekleyin:

var color by remember { mutableStateOf(Green) }
Box(
    Modifier
        .background(color)
        .onFocusChanged { color = if (it.isFocused) Blue else Green }
        .focusable()
) {
    Text("Focusable 1")
}

Daha fazla bilgi için Kompozit öğeleri odaklanılabilir hale getirme başlıklı makaleyi inceleyin.

Odak etkinleştirildiğinde Android çerçevesi, odaklanılabilir tüm bileşenler için konumlarına göre bir gezinme eşlemesi oluşturur. Bu genellikle beklendiği gibi çalışır ve başka geliştirme yapılması gerekmez.

Ancak Oluştur, sekmeler ve listeler gibi karmaşık bileşenler için sekmeli gezinmeyle ilgili bir sonraki öğeyi her zaman doğru şekilde belirlemez. Örneğin, bileşenlerden biri tamamen görünmeyen yatay bir kaydırma çubuğu olduğunda.

Odak davranışını kontrol etmek için focusGroup değiştiriciyi bir derleme koleksiyonunun üst derlemesine ekleyin. Odak, gruba taşınır ve ardından grup içinden geçerek sonraki odaklanılabilir bileşene taşınır. Örneğin:

Row {
    Column(Modifier.focusGroup()) {
        Button({}) { Text("Row1 Col1") }
        Button({}) { Text("Row2 Col1") }
        Button({}) { Text("Row3 Col1") }
    }
    Column(Modifier.focusGroup()) {
        Button({}) { Text("Row1 Col2") }
        Button({}) { Text("Row2 Col2") }
        Button({}) { Text("Row3 Col2") }
    }
}

Daha fazla bilgi için Odak gruplarıyla tutarlı gezinme sağlama başlıklı makaleyi inceleyin.

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. TextField ) 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.

onKeyEvent değiştiriciyi kullanarak tek tek tuş vuruşlarını işleyebilirsiniz. Bu değiştirici, değiştirilen bileşen bir tuş etkinliği aldığında çağrılan bir lambda kabul eder. KeyEvent#type mülkü, etkinliğin tuş basma (KeyDown) mı yoksa tuş bırakma (KeyUp) mı olduğunu belirlemenizi sağlar:

Box(
    modifier = Modifier.focusable().onKeyEvent {
        if(
            it.type == KeyEventType.KeyUp &&
            it.key == Key.S
        ) {
            doSomething()
            true
        } else {
            false
        }
    }
)  {
    Text("Press S key")
}

Alternatif olarak, onKeyUp() geri çağırma işlevini geçersiz kılabilir ve alınan her anahtar kodu için beklenen davranışı ekleyebilirsiniz:

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

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.

KeyEvent nesnesi, değiştirici tuşlara basılı olup olmadığını belirten aşağıdaki özelliklere sahiptir:

Örnek:

Box(
    Modifier.onKeyEvent {
        if (it.isAltPressed && it.key == Key.A) {
            println("Alt + A is pressed")
            true
        } else {
            false
        }
    }
    .focusable()
)

Daha fazla bilgi için aşağıdakilere bakın:

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.

Kalem MotionEvent nesnelerine erişmek için bir çizim yüzeyine pointerInteropFilter değiştiriciyi ekleyin. Hareket etkinliklerini işleyen bir yöntem içeren bir ViewModel sınıfı uygulayın; yöntemi pointerInteropFilter değiştiricinin onTouchEvent lambdası olarak iletin:

@Composable
@OptIn(ExperimentalComposeUiApi::class)
fun DrawArea(modifier: Modifier = Modifier) {
   Canvas(modifier = modifier
       .clipToBounds()
       .pointerInteropFilter {
           viewModel.processMotionEvent(it)
       }

   ) {
       // Drawing code here.
   }
}

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:

Box(modifier = Modifier.fillMaxSize()) {
    AndroidView(
        modifier = Modifier.fillMaxSize(),
        factory = { context ->
            val rootView = FrameLayout(context)
            val onContextClickListener =
                View.OnContextClickListener { view ->
                    showContextMenu()
                    true
                }
            rootView.setOnContextClickListener(onContextClickListener)
            rootView
        },
    )
}

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 bileşenler için geçerlidir:

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 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 pointerInput değiştiricisi uygulamalıdır:

@Composable
private fun LogPointerEvents(filter: PointerEventType? = null) {
    var log by remember { mutableStateOf("") }
    Column {
        Text(log)
        Box(
            Modifier
                .size(100.dp)
                .background(Color.Red)
                .pointerInput(filter) {
                    awaitPointerEventScope {
                        while (true) {
                            val event = awaitPointerEvent()
                            // handle pointer event
                            if (filter == null || event.type == filter) {
                                log = "${event.type}, ${event.changes.first().position}"
                            }
                        }
                    }
                }
        )
    }
}

Aşağıdakileri belirlemek için PointerEvent nesnesini inceleyin:

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