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.
Navigasyon
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:
KeyEvent.isCtrlPressed()
,KeyEvent.isShiftPressed()
,KeyEvent.isAltPressed()
,KeyEvent.isMetaPressed()
veya
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:
MotionEvent#getToolType()
, ekranla 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.AXIS_TILT
veMotionEvent.AXIS_ORIENTATION
ileMotionEvent#getAxisValue()
, ekran kaleminin fiziksel eğimini ve yönünü (destekleniyorsa) sağlar
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:
MotionEvent#getHistoricalX()
MotionEvent#getHistoricalY()
MotionEvent#getHistoricalPressure()
MotionEvent#getHistoricalAxisValue()
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:
- Geliştirici moduna geçip 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- Dosyanın sonundaki yeni bir satıra
--ash-enable-palette
eklemek ve düzenlemek içini
tuşuna 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.
- 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
- Uygulamanın dışından sürüklenen öğelere erişmek için
requestDragAndDropPermissions()
'dan izin istemeyi unutmayın. Öğelerin 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, 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
veACTION_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" />