Kullanıcılar, büyük ekranlı cihazlarda uygulamalarla etkileşim kurmak için genellikle klavye, fare, dokunmatik yüzey, ekran kalemi veya oyun kumandası kullanır. 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 gerçekleştirme başlıklı makaleyi inceleyin.
- Gelişmiş klavye desteğini test edin. Örneğin, Sekme tuşu ve ok tuşuyla klavye gezinme, Enter tuşuyla metin girişi onayı ve boşluk tuşuyla medya uygulamalarında oynatma ve duraklatma.
- Temel fare etkileşimlerini test edin. 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 bu etkileşimlere dahildir.
- Kalem, oyun kumandası ve müzik uygulaması MIDI kumandaları gibi uygulamaya özel giriş cihazlarını test edin.
- Gelişmiş giriş desteği sayesinde uygulamanızın masaüstü ortamlarında öne çıkmasını sağlayabilirsiniz. Örneğin, DJ uygulamalarında geçiş efekti için dokunmatik yüzey, oyunlarda fare yakalama ve klavye odaklı kullanıcılar için klavye kısayolları.
Klavye
Uygulamanızın klavye girişine verdiği yanıt, 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, dokunma odaklı uygulamalarda nadiren uygulanır ancak kullanıcılar, uygulamayı kullanırken klavyeyi ellerine aldıklarında bu özelliği bekler. Erişilebilirlik ihtiyaçları olan kullanıcılar için telefonlarda, tabletlerde, katlanabilir cihazlarda ve masaüstü cihazlarda klavyeyle gezinme önemli olabilir.
Birçok uygulamada, ok tuşu ve Tab tuşuyla gezinme, Android çerçevesi tarafından otomatik olarak gerçekleştirilir. Örneğin, bazı composable'lar varsayılan olarak odaklanılabilir. Bunlara Button veya clickable değiştiricisine sahip bir composable dahildir. Klavye ile gezinme genellikle ek kod olmadan çalışır. Varsayılan olarak odaklanılamayan ö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 Making a composable focusable (Bir composable öğeyi 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 özellik genellikle beklendiği gibi çalışır ve başka geliştirme yapılması 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 tam olarak görünür olmayan yatay kaydırılabilir bir öğe olduğunda bu durum yaşanır.
Odak davranışını kontrol etmek için bir composable koleksiyonunun üst composable'ına focusGroup değiştiricisini ekleyin. Odak önce gruba, ardından grupta ilerleyerek odaklanılabilir bir sonraki 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.
Yalnızca klavyeyi kullanarak uygulamanızın her kullanıcı arayüzü öğesine erişimi 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ı
Metin girişi için (IME) ekran üzerinde sanal klavye kullanıldığında (ör. TextField, EditText) uygulamalar, ek geliştirme çalışması yapılmasına gerek kalmadan büyük ekranlı cihazlarda beklendiği gibi çalışmalıdır.Çerçeve tarafından tahmin edilemeyen tuş vuruşları için uygulamaların davranışı kendilerinin yönetmesi gerekir. Bu durum özellikle özel görünümleri olan uygulamalar için geçerlidir.
Örneğin, mesaj göndermek için Enter tuşunu kullanan sohbet uygulamaları, oynatmayı başlatmak ve durdurmak için boşluk çubuğunu kullanan medya uygulamaları ve hareketi kontrol etmek için w, a, s ve d tuşlarını kullanan oyunlar.
Değiştirilmiş bileşen bir tuş etkinliği aldığında çağrılan bir lambda'yı kabul eden onKeyEvent değiştiricisiyle tek tek tuş vuruşlarını işleyebilirsiniz.
KeyEvent#type özelliği, etkinliğin tuşa basma (KeyDown) veya tuşu serbest bırakma (KeyUp) olup olmadığını 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ğırmasını 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şlevini kullanmak, 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ı tuttuğunu 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 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ının kullanılması beklenir. Bir uygulama kısayolları uygulamıyorsa kullanıcılar bu deneyimden rahatsız olabilir. İleri düzey kullanıcılar, sık kullanılan uygulamaya özel görevler için kısayolları da tercih eder. Kısayollar, uygulamaların kullanımını kolaylaştırır ve kısayol içermeyen uygulamalardan ayırt edilmesini sağlar.
Sık kullanılan kısayollardan bazıları Ctrl+S (kaydet), Ctrl+Z (geri al) ve Ctrl+Üst Karakter+Z (yeniden yap) tuş kombinasyonlarıdır. 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ı belirten 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 kaynaklara 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 olabilir. Android uygulamaları Bluetooth girişi alabilir ancak USB girişi alamaz.
Kalem MotionEvent nesnelerine erişmek için çizim yüzeyine pointerInteropFilter değiştiricisini ekleyin. Hareket etkinliklerini işleyen bir yöntem içeren 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(), ekrana temas eden araca bağlı olarakTOOL_TYPE_FINGER,TOOL_TYPE_STYLUSveyaTOOL_TYPE_ERASERdeğerini döndürür.MotionEvent#getPressure(), kalemle 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).
Geçmiş puanlar
Android, giriş etkinliklerini gruplandırır ve her kare için bir kez teslim eder. Kalem, etkinlikleri ekrana kıyasla çok daha yüksek sıklıkta 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çiyle dokunmayı reddetme
Kullanıcılar ekran kalemiyle çizim yaparken, yazarken veya uygulamanızla etkileşimde bulunurken bazen avuçlarıyla ekrana dokunur. Dokunma etkinliği (ACTION_DOWN veya ACTION_POINTER_DOWN olarak ayarlanmış) sistem, yanlışlıkla yapılan avuç içi dokunuşunu tanıyıp dikkate almadan önce uygulamanıza bildirilebilir.
Android, MotionEvent göndererek avuç içiyle 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 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çiyle dokunmayı reddetme yalnızca tek işaretçiyle dokunma etkinliklerinde 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ğıdaysa sistem, avuç içi reddini algılamak için yetersiz olan ACTION_POINTER_UP değerini ayarlar.
Android 13
Android 13 (API düzeyi 33) ve sonraki sürümlerde, tek işaretçi avuç içi dokunuşuysa sistem, hareket etkinliği nesnesinde ACTION_CANCEL ve FLAG_CANCELED'yi ayarlayarak etkinliği iptal eder. Diğer işaretçiler kapalı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çiyle reddetmeyi (veya başka bir etkinlik iptalini) gösterip göstermediğ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 amaç vardır. 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>
Sisteme kaydedilen uygulamalar, kullanıcı tarafından varsayılan not alma uygulaması olarak seçilebilir. Yeni bir not istendiğinde uygulama, kalemle giriş için hazır boş bir not oluşturmalıdır. Kullanıcı bir resme (ör. ekran görüntüsü veya indirilen resim) açıklama eklemek istediğinde uygulama, ClipData ile başlatılır. Bu öğe, content:// URI'leri içeren bir veya daha fazla öğe içerir. 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, not alma amaçlarına etkin bir kalem olmadan 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.- Dosyanın sonuna yeni bir satır eklemek için
ituşuna basarak--ash-enable-palettesimgesini düzenleyin ve ekleyin. - Esc tuşuna basıp :, w, q yazıp Enter tuşuna basarak kaydedin.
- Normal ChromeOS kullanıcı arayüzüne dönmek için Ctrl+Alt+F1 tuşlarına basın.
- Oturumu kapatıp tekrar açın.
Artık rafta bir kalem menüsü olmalıdır:
- Raftaki kalem düğmesine dokunun ve Yeni not'u seçin. Bu işlem, boş bir çizim notu açar.
- Ekran görüntüsü alın. Raftan kalem 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ı resimle birlikte başlatır ve resim, açıklama eklenmeye hazır olur.
Fare ve dokunmatik alan desteği
Çoğu uygulamanın genellikle yalnızca üç büyük ekran odaklı etkinliği işlemesi gerekir: sağ tıklama, üzerine gelme ve sürükleyip bırakma.
Sağ tıklama
Bir liste öğesine dokunup basılı tutma gibi, bir uygulamanın bağlam menüsü göstermesine neden olan tüm işlemler sağ tıklama etkinliklerine de yanıt vermelidir.
Uygulamalar, sağ tıklama etkinliklerini işlemek için 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
},
)
}
İçerik menüsü oluşturma hakkında ayrıntılı bilgi için İçerik menüsü oluşturma başlıklı makaleyi inceleyin.
İmleçle üzerine gelin
Fareyle üzerine gelme etkinliklerini işleyerek uygulama düzenlerinizin daha iyi görünmesini ve daha kolay kullanılması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 olması gibi etkileşimli davranışlara sahip olup olmadığını belirtme
- İşaretçi üzerine geldiğinde büyük bir listedeki veya ızgaradaki öğ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 tabletler, telefonlar ve bölünmüş ekran modundaki katlanabilir cihazlar için de geçerlidir.
Kullanıcıların öğeleri uygulamanıza sürükleyip sürüklemeyeceğini düşünün. Örneğin, fotoğraf düzenleyiciler fotoğraf, ses çalarlar 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ümlerini inceleyin ve Android on ChromeOS — Implementing Drag & Drop (ChromeOS'te Android — Sürükle ve Bırak İşlemini Uygulama) başlıklı blog yayınını inceleyin.
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üklenmesi için
View.DRAG_FLAG_GLOBALişaretine sahip olması gerekir.Sürükleme etkinliği başlatma başlıklı makaleye bakın.
Gelişmiş işaretçi desteği
Fare ve dokunmatik alan girişinin gelişmiş şekilde işlenmesini sağlayan uygulamalar, PointerEvent elde etmek için
pointerInput değiştiricisini 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#changescihazında fare, kalem, dokunma vb.PointerEventType: Basma, taşıma, kaydırma ve bırakma gibi işaretçi işlemleri
Oyun kumandaları
Bazı büyük ekran Android cihazlar, en fazla dört oyun kumandasını destekler. Oyun kumandalarını işlemek için standart Android oyun kumandası API'lerini kullanın (bkz. Oyun kumandalarını destekleme).
Oyun kumandası düğmeleri, ortak bir eşleme kullanılarak yaygın değerlerle eşlenir. Ancak tüm oyun kumandası üreticileri aynı eşleme kurallarını kullanmaz. Kullanıcıların farklı popüler kontrol cihazı 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.
Çeviri girişi modu
ChromeOS, varsayılan olarak giriş çevirisi modunu etkinleştirir. Bu mod, çoğu Android uygulamasının masaüstü ortamında beklendiği gibi çalışmasına yardımcı olur. Örneğin, dokunmatik alanda iki parmakla kaydırma, fare tekerleğiyle kaydırma ve ham ekran koordinatlarını pencere koordinatlarıyla eşleme otomatik olarak etkinleştirilebilir. Genellikle uygulama geliştiricilerin bu davranışların hiçbirini kendilerinin uygulaması gerekmez.
Bir uygulama özel giriş davranışı uyguluyorsa (ör. özel iki parmakla dokunmatik alan sıkıştırma hareketi tanımlama) veya bu giriş çevirileri, uygulama tarafından beklenen giriş etkinliklerini sağlamıyorsa Android manifestine aşağıdaki etiketi ekleyerek giriş çevirisi modunu devre dışı bırakabilirsiniz:
<uses-feature
android:name="android.hardware.type.pc"
android:required="false" />