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.
Navigasyon
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:
MotionEvent.getToolType()
, yüzeyle temas eden araca bağlı olarakTOOL_TYPE_FINGER
, TOOL_TYPE_STYLUS veyaTOOL_TYPE_ERASER
döndürürMotionEvent.getPressure()
, ekran kalemine uygulanan fiziksel basıncı bildirir (destekleniyorsa)MotionEvent.getAxisValue()
,MotionEvent.AXIS_TILT
veMotionEvent.AXIS_ORIENTATION
ekran kaleminin fiziksel eğimini ve yönünü okumak için kullanılabilir (destekleniyorsa)
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:
- 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.conf
komutunu çalıştırın--ash-enable-palette
öğesini düzenlemek ve dosyanın sonundaki yeni bir satıra eklemek içini
tuşlarına basın- 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.
- Çı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
veACTION_BUTTON_RELEASE
etkinlikleri oluşturur. Tüm fare/dokunmatik yüzey düğmelerinin mevcut durumunugetButtonState()
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" />