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.
Gezinme
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 tuşuyla gezinme, Android çerçevesi tarafından otomatik olarak gerçekleştirilir. Örneğin, bazı composable'lar varsayılan olarak odaklanabilir (ör. Button veya clickable değiştiricisine sahip bir composable). Klavyeyle gezinme genellikle ek kod olmadan çalışır. Varsayılan olarak odaklanılabilir olmayan özel composable'lar için klavyeyle gezinmeyi 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 Bir composable'ı odaklanılabilir yapma başlıklı makaleyi inceleyin.
Odak etkinleştirildiğinde Android çerçevesi, odaklanabilir tüm bileşenler için konumlarına göre bir gezinme eşlemesi oluşturur. Bu genellikle beklendiği gibi çalışır ve daha fazla geliştirme gerekmez.
Ancak Compose, sekmeler ve listeler gibi karmaşık composable'lar için sekmeli gezinmede her zaman doğru sonraki öğeyi belirlemez. Örneğin, composable'lardan biri tamamen görünür olmayan yatay kaydırılabilir bir öğe olduğunda.
Odak davranışını kontrol etmek için bir composable koleksiyonunun üst composable'ına focusGroup değiştiricisini ekleyin. Odak, gruba taşınır ve ardından bir sonraki odaklanılabilir bileşene taşınmadan önce grup içinde hareket eder. Ö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.
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.
TextField
) 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.
Değiştirilen bileşen bir tuş etkinliği aldığında çağrılan bir lambda kabul eden onKeyEvent değiştiriciyle tek tek tuş vuruşlarını işleyebilirsiniz.
KeyEvent#type özelliği, etkinliğin bir tuşa basma (KeyDown) veya tuşu bırakma (KeyUp) işlemi olup olmadığını belirlemenize olanak tanır:
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 tuş kodu için beklenen davranışı ekleyebilirsiniz:
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)
}
}
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.
KeyEvent nesnesi, değiştirici tuşlara basılıp basılmadığını gösteren aşağıdaki özelliklere sahiptir:
Örneğin:
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ğıdaki makaleleri inceleyin:
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 MotionEvent nesnelerine erişmek için çizim yüzeyine pointerInteropFilter değiştiricisini ekleyin. Hareket etkinliklerini işleyen bir yöntemle ViewModel sınıfı uygulayın. Yöntemi, pointerInteropFilter değiştiricisinin onTouchEvent lambda'sı 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:
MotionEvent#getToolType(), ekranla temas eden araca bağlı olarakTOOL_TYPE_FINGER,TOOL_TYPE_STYLUSveyaTOOL_TYPE_ERASERdeğerini döndürür.MotionEvent#getPressure(), ekran kalemiyle uygulanan fiziksel basıncı bildirir (destekleniyorsa).MotionEvent#getAxisValue()ileMotionEvent.AXIS_TILTveMotionEvent.AXIS_ORIENTATION, ekran kaleminin fiziksel eğimini ve yönünü sağlar (destekleniyorsa).
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:
MotionEvent#getHistoricalX()MotionEvent#getHistoricalY()MotionEvent#getHistoricalPressure()MotionEvent#getHistoricalAxisValue()
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:
- Geliştirici moduna geçme ve cihazı yazılabilir hale getirme
- Terminal açmak için Ctrl+Alt+F2 tuşlarına basın.
sudo vi /etc/chrome_dev.confkomutunu çalıştırın.- Dosyayı düzenlemek ve sonuna yeni bir satır olarak
--ash-enable-paletteeklemek içinituşuna basın. - Esc tuşuna basıp :, w, q yazarak ve Enter tuşuna basarak kaydedin.
- Normal ChromeOS kullanıcı arayüzüne dönmek için Ctrl+Alt+F1 tuşlarına basın.
- Çı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:
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 işleyerek uygulama düzenlerinizi daha şık ve kullanımı daha kolay hale getirebilirsiniz. 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 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 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
- Uygulamanın dışından sürüklenen öğelere erişmek için
requestDragAndDropPermissions()ile izin istemeyi unutmayın. Bir öğenin diğer uygulamalara sürüklenebilmesi için
View.DRAG_FLAG_GLOBALişaretine sahip olması gerekir.Sürükleme etkinliği başlatma bölümüne bakın.
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
pointerInput değiştirici 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:
PointerType:PointerEvent#changesüzerinden fare, ekran kalemi, dokunma vb.PointerEventType: Basma, hareket ettirme, kaydırma ve bırakma gibi işaretçi işlemleri
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" />