Aşağıdaki materyal, uygulama geliştiriciler içindir.
Uygulamanızın çevirmelini desteklemesi için şunları yapmanız GEREKİR:
- İlgili etkinlik düzenine bir
FocusParkingView
yerleştirin. - Odaklanabilir olan (veya olmayan) görünümlere emin olun.
- Şu hariç odaklanılabilir tüm görünümlerinizi sarmalamak için
FocusArea
öğelerini kullanın:FocusParkingView
.
Bu görevlerin her biri aşağıda açıklanmıştır. Bu görevlerin her biri, ortamınızı çevirme özellikli uygulamalar geliştirmek.
Döner kumanda ayarlama
Çevirmeli uygulama geliştirmeye başlamadan önce döner kumandaya ihtiyacınız vardır destekleyici materyalleri değerlendireceksiniz. Aşağıda açıklanan seçeneklere sahipsiniz.
Emülatör
source build/envsetup.sh && lunch car_x86_64-userdebug m -j emulator -wipe-data -no-snapshot -writable-system
aosp_car_x86_64-userdebug
uzantısını da kullanabilirsiniz.
Emülasyonlu döner kumandaya erişmek için:
- Araç çubuğunun altındaki üç noktaya dokunun:
'nı inceleyin. - Genişletilmiş kontroller penceresinde Arabayı döndürme'yi seçin:
'nı inceleyin.
USB klavye
- Android Automotive OS (AAOS) çalıştıran cihazınıza bir USB klavye takın. Bazı durumlarda dokunmatik klavyenin görünmesini engeller.
userdebug
veyaeng
derlemesi kullanın.- Önemli etkinlik filtrelemeyi etkinleştir:
adb shell settings put secure android.car.ROTARY_KEY_EVENT_FILTER 1
. - Her bir işleme karşılık gelen anahtarı bulmak için aşağıdaki tabloya bakın:
Anahtar Çevirmeli işlem SORU Saat yönünün tersine döndür E Saat yönünde döndür A Sola sürükle D Sağa sürükle W Yukarı sürükle S Aşağı sürükle F veya Virgül Orta düğme R veya Esc Geri düğmesi
ADB komutları
Çevirmeli giriş etkinliklerini eklemek için car_service
komutlarını kullanabilirsiniz. Bu komutlar
Android Automotive OS (AAOS) çalıştıran cihazlarda veya emülatörde çalıştırılabilir.
car_service komutları | Çevirmeli giriş |
---|---|
adb shell cmd car_service inject-rotary |
Saat yönünün tersine döndür |
adb shell cmd car_service inject-rotary -c true |
Saat yönünde döndür |
adb shell cmd car_service inject-rotary -dt 100 50 |
Saat yönünün tersine birden çok kez döndür (100 ms önce ve 50 ms önce) |
adb shell cmd car_service inject-key 282 |
Sola sürükle |
adb shell cmd car_service inject-key 283 |
Sağa sürükle |
adb shell cmd car_service inject-key 280 |
Yukarı sürükle |
adb shell cmd car_service inject-key 281 |
Aşağı sürükle |
adb shell cmd car_service inject-key 23 |
Ortadaki düğme tıklaması |
adb shell input keyevent inject-key 4 |
Geri düğmesi tıklaması |
OEM döner kumanda
Çevirmeli kumanda donanımınız çalışır durumda olduğunda gerçekçi bir seçenek olur. Özellikle hızlı rotasyonu test etmek için yararlıdır.
OdaklanmaParkManzarı
FocusParkingView
,
Araba Kullanıcı Arayüzü Kitaplığı (araba-ui-kitaplığı).
RotaryService
, çevirmeli kumandayla gezinmeyi desteklemek için bunu kullanır.
FocusParkingView
, odaklanılabilir ilk görünüm olmalıdır
tıklayın. Tüm FocusArea
öğelerinin dışına yerleştirilmelidir. Her pencerede bir tane olmalıdır
FocusParkingView
car-ui-library temel düzenini zaten kullanıyorsanız
FocusParkingView
içeriyorsa başka bir öğe eklemeniz gerekmez
FocusParkingView
Aşağıda gösterilen FocusParkingView
örneğidir:
RotaryPlayground
.
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <com.android.car.ui.FocusParkingView android:layout_width="wrap_content" android:layout_height="wrap_content"/> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"/> </FrameLayout>
FocusParkingView
başvurusunun nedenleri şunlardır:
- Odak başka bir pencerede ayarlandığında Android, odağı otomatik olarak temizlemez. Şu durumda:
odağı temizlemeye çalıştığınızı varsayalım. Android bu penceredeki bir görünüme yeniden odaklar.
eş zamanlı olarak iki pencereden odaklanılmasına neden olur.
FocusParkingView
ekleme eklemek bu sorunu çözebilir. Bu görünüm şeffaf ve varsayılan odak noktası devre dışı bırakılmalıdır. Böylece, odaklanılmış olup olmadığına bakılmaz.RotaryService
adlı kullanıcının odaklanmasını sağlamak için odaklanabilir dokunun. - Geçerli pencerede yalnızca bir
FocusArea
varsa kumandayı döndürünFocusArea
koşulu,RotaryService
özelliğinin odağı taşımasına neden olur sağdaki görünümden soldaki görünüme (veya tam tersi) görebilirsiniz. Bu görünüm ekleniyor eklemek sorunu çözebilir.RotaryService
, odağı ne zaman belirler?FocusParkingView
ise sarmalamanın yakın olduğunu belirleyip Bu noktada, odağı hareket ettirmediği için etrafa sarmalanmayı önleyecektir. - Çevirmeli kontrol bir uygulamayı başlattığında Android, ilk odaklanılabilir görünüme odaklanır.
her zaman
FocusParkingView
olur.FocusParkingView
odaklanılacak en uygun görünümü belirler ve ardından odağı uygular.
Odaklanılabilir görünümler
RotaryService
, Android çerçevesinin temelini
mevcut
veya telefonların fiziksel klavyeleri ve d-pad'leri olduğu eski zamanlardan beri görüntüleme odağı kavramıdır.
Mevcut android:nextFocusForward
özelliği, dönüşümlü reklam için yeniden tasarlandı
(FocusArea özelleştirmesine bakın), ancak
android:nextFocusLeft
, android:nextFocusRight
,
android:nextFocusUp
ve android:nextFocusDown
değil.
RotaryService
yalnızca odaklanılabilen görüntülemelere odaklanır. Biraz görünüm,
Örneğin Button
,
odaklanılabilir olmalıdır. TextView
ve ViewGroup
gibi diğer öğeler
değildir. Tıklanabilir görünümlere otomatik olarak odaklanılabilir, görünümler ise otomatik olarak
tıklama işleyici varsa tıklanabilir. Bu otomatik mantık, istenen sonucun
görünümün odaklanılabilirliğini açıkça ayarlamanız gerekmez. Otomatik mantık
elde edilmesini sağlamak için, android:focusable
özelliğini
true
veya false
ya da görünümün odaklanılabilirliğini
View.setFocusable(boolean)
. RotaryService
kullanıcısının odaklanması için görünümün
aşağıdaki şartları karşılamanız gerekir:
- Odaklanabilir
- Etkin
- Gösteriliyor
- Genişlik ve yükseklik için sıfır olmayan değerlere sahip olmalıdır.
Bir görünüm tüm bu koşulları karşılamıyorsa (ör. odaklanılabilir ancak devre dışı bir düğme)
Kullanıcı odaklamak için döndürme kontrolünü kullanamaz. Devre dışı bırakılmış görünümlere odaklanmak istiyorsanız
nasıl kontrol edeceğinizi kontrol etmek için android:state_enabled
yerine özel bir durum
Android'in bu görünümü devre dışı olarak kabul etmesi gerektiği belirtilmeden görünür. Uygulamanız,
kullanıcıya dokunulduğunda görünümün neden devre dışı bırakıldığını bildirir. Sonraki bölümde bunun nasıl yapılacağı açıklanmaktadır.
Özel durum
Özel bir eyalet eklemek için:
- Özel özellik eklemek için
görünümünüze dokunun. Örneğin,
state_rotary_enabled
CustomView
görüntüleme sınıfı, şunu kullanın:<declare-styleable name="CustomView"> <attr name="state_rotary_enabled" format="boolean" /> </declare-styleable>
- Bu durumu izlemek için erişimci yöntemleriyle birlikte görünümünüze bir örnek değişkeni ekleyin:
private boolean mRotaryEnabled; public boolean getRotaryEnabled() { return mRotaryEnabled; } public void setRotaryEnabled(boolean rotaryEnabled) { mRotaryEnabled = rotaryEnabled; }
. - Görünümünüz oluşturulduğunda özelliğinizin değerini okumak için:
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomView); mRotaryEnabled = a.getBoolean(R.styleable.CustomView_state_rotary_enabled);
. - Görünüm sınıfınızda
onCreateDrawableState()
yöntemini geçersiz kılın ve ardından ve uygun olduğu durumlarda özel durumu ekleyin. Örnek:@Override protected int[] onCreateDrawableState(int extraSpace) { if (mRotaryEnabled) extraSpace++; int[] drawableState = super.onCreateDrawableState(extraSpace); if (mRotaryEnabled) { mergeDrawableStates(drawableState, { R.attr.state_rotary_enabled }); } return drawableState; }
. - Görünümünüzün tıklama işleyicisinin, durumuna bağlı olarak farklı bir şekilde çalışmasını sağlayın. Örneğin,
tıklama işleyici hiçbir şey yapmayabilir veya
mRotaryEnabled
false
. - Düğmenin devre dışı olarak görünmesini sağlamak için görünümünüzün arka planında çekilebilirsiniz:
android:state_enabled
yerineapp:state_rotary_enabled
. Henüz yapmadıysanız şunları eklemeniz gerekir:xmlns:app="http://schemas.android.com/apk/res-auto"
. - Görünümünüz herhangi bir düzende devre dışı bırakılırsa
android:enabled="false"
öğesiniapp:state_rotary_enabled="false"
ve ardındanapp
ad alanını ekleyin. Yukarıdakiyle aynı. - Görünümünüz programatik olarak devre dışı bırakıldıysa çağrıları
setEnabled()
ile değiştirinsetRotaryEnabled()
için yapılan çağrılarla.
OdakAlanı
Gezinmek amacıyla odaklanılabilir görünümleri bloklara bölmek için FocusAreas
kullanın
ve diğer uygulamalarla tutarlı olmasını
sağlar. Örneğin, uygulamanızın bir araç çubuğu varsa
uygulamanızın geri kalanından ayrı bir FocusArea
içinde olmalıdır. Sekme çubukları ve
diğer gezinme öğeleri de uygulamanın geri kalanından ayrılmalıdır. Büyük listeler
genellikle kendi FocusArea
öğesine sahip olmalıdır. Aksi takdirde, kullanıcıların dönüşümlü olarak yayınlaması gerekir.
bazı görünümlere erişmek için
tüm listeyi inceleyebilirsiniz.
FocusArea
, araba kullanıcı arayüzü kitaplığında LinearLayout
öğesinin bir alt sınıfıdır.
Bu özellik etkinleştirildiğinde, FocusArea
bir vurgu çizimi için
her tür öğeye odaklanılır. Daha fazla bilgi edinmek için bkz.
Vurgulama özelleştirmeye odaklanın.
Düzen dosyasında bir gezinme bloğu oluştururken,
Bu blok için kapsayıcı olarak LinearLayout
yerine FocusArea
kullanın.
Aksi takdirde, bloğu FocusArea
içine alın.
FocusArea
öğesini başka bir FocusArea
ile iç içe YERLEŞTİRMEYİN.
Aksi takdirde gezinme davranışı tanımlanmamış olur. Odaklanabilir tüm görünümlerin
FocusArea
içinde iç içe yerleştirilmiştir.
Şu konumda FocusArea
örneği:
RotaryPlayground
aşağıda gösterilmiştir:
<com.android.car.ui.FocusArea android:layout_margin="16dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:singleLine="true"> </EditText> </com.android.car.ui.FocusArea>
FocusArea
aşağıdaki şekilde çalışır:
RotaryService
, döndürme ve sürükleme işlemlerini işlerken örnekleri arar görünüm hiyerarşisindeFocusArea
.RotaryService
, döndürme etkinliği alırken odağı başka bir öğeye taşır AynıFocusArea
içinde odaklanılabilen görünüm.- Otomatik hatırlatma etkinliği alınırken
RotaryService
, odağı başka bir görünüme taşır başka birFocusArea
içinde (genellikle bitişik olan) odaklanabilenler.
Düzeninize herhangi bir FocusAreas
dahil etmezseniz kök görünümü işlenir
bir odak noktası
görevi görebilir. Kullanıcı uygulamada gezinmek için otomatik olarak gezinemez. Bunun yerine
odaklanılabilir tüm görünümlerde dönüşümlü olarak gösterilebilir. Bu görünümler, iletişim kutuları için yeterli olabilir.
FocusArea'yı özelleştirme
Çevirmeli gezinmeyi özelleştirmek için iki standart Görünüm özelliği kullanılabilir:
android:nextFocusForward
, uygulama geliştiricilerin rotasyonu belirtmesine olanak tanır düzenli olarak paylaşabilirsiniz. Bu, sayfanızın, sekme sırasını kontrol etmek için kullanılan klavyeyle gezinme. Döngü oluşturmak için bu özelliği KULLANMAYIN. Bunun yerine, döngü oluşturmak içinapp:wrapAround
işlevini (aşağıya bakın) kullanın.android:focusedByDefault
, uygulama geliştiricilerin varsayılan odak görünümüne sahip olursunuz. Bu özelliği KULLANMAYIN ve AynıFocusArea
içindeapp:defaultFocus
(aşağıya bakın).
FocusArea
, çevirmeli gezinmeyi özelleştirmek için bazı özellikleri de tanımlar.
Örtülü odak alanları bu özelliklerle özelleştirilemez.
- (Android 11 QPR3, Android 11 Araba,
Android 12)
app:defaultFocus
, şu amaçlarla kullanılabilir: odaklanılabilir bir alt görünümün kimliğini belirtin. Bu kimlik, kullanıcı otomatik hatırlatmalar:FocusArea
- (Android 11 QPR3, Android 11 Araba,
Android 12)
app:defaultFocusOverridesHistory
değeritrue
olarak ayarlanabilir. Böylece, buFocusArea
başka bir görüntülemeye odaklanılmıştı. - (Android 12)
Şunu kullan:app:nudgeLeftShortcut
,app:nudgeRightShortcut
,app:nudgeUpShortcut
veapp:nudgeDownShortcut
odaklanılabilir alt görünümün kimliğini belirtir. Bu kimlik, belirli bir yöne otomatik Daha fazla bilgi edinmek için kısayolları sürükleyin.(Android 11 QPR3, Android 11 Araba, Android 12'de desteği sonlandırıldı)
app:nudgeShortcut
veapp:nudgeShortcutDirection
yalnızca bir tane otomatik hatırlatma kısayolunu destekliyor. - (Android 11 QPR3, Android 11 Araba,
Android 12)
Döndürmeyi buFocusArea
içinde sarmalamak üzere etkinleştirmek içinapp:wrapAround
true
olarak ayarlanabilir. Bu, genellikle görüntülemeler oval ya da oval olabilir. - (Android 11 QPR3, Android 11 Araba,
Android 12)
Vurgulamanın dolgusunu buFocusArea
,app:highlightPaddingStart
kullanın,app:highlightPaddingEnd
,app:highlightPaddingTop
,app:highlightPaddingBottom
,app:highlightPaddingHorizontal
, veapp:highlightPaddingVertical
. - (Android 11 QPR3, Android 11 Araba,
Android 12)
Otomatik hatırlatma hedefi bulmak amacıyla buFocusArea
öğesinin algılanan sınırlarını ayarlamak için: şunu kullanın:app:startBoundOffset
,app:endBoundOffset
,app:topBoundOffset
,app:bottomBoundOffset
,app:horizontalBoundOffset
veapp:verticalBoundOffset
. - (Android 11 QPR3, Android 11 Araba,
Android 12)
Bir belirtilen yönlerde bitişikFocusArea
(veya alanlar) içinapp:nudgeLeft
,app:nudgeRight
,app:nudgeUp
veapp:nudgeDown
. Geometrik arama varsayılan olarak kullanıldığında bunu kullanın istenen hedefi bulmuyor.
Otomatik hatırlatma, genellikle FocusAreas arasında gezinmeyi sağlar. Ancak otomatik hatırlatma kısayolları sayesinde
Otomatik hatırlatma özelliği bazen önce FocusArea
içinde gezinir. Böylece kullanıcı
gitmek için iki kez hareket ettirin.FocusArea
Otomatik sürükle kısayolları faydalı
FocusArea
, uzun bir liste ve ardından gelen bir
Kayan İşlem Düğmesi,
aşağıdaki örnekte olduğu gibi:
Otomatik hatırlatma kısayolu olmasaydı kullanıcının değiştirebilirsiniz.
Vurgulamayı özelleştirmeye odaklan
Yukarıda belirtildiği gibi RotaryService
, Android çerçevesinin mevcut konseptini temel alır.
görünüm odağı. Kullanıcı döndüğünde ve otomatik hatırlatma yaptığında RotaryService
, odağı hareket ettirir.
odaklanıp diğerini odaklamamasını sağlayabilirsiniz. Android'de bir görünüme odaklanıldığında görünüm:
- Kendi odaklama vurgusunu belirtti. Android, görünümün odak vurgusunu çizer.
- Odak vurgusu belirtilmiyor ve varsayılan odak vurgusu devre dışı bırakılmıyor, Android görünüm için varsayılan odaklamayı çizer.
Dokunma için tasarlanmış uygulamalarda genellikle odaklama için uygun vurgular belirtilmez.
Varsayılan odak noktası, Android çerçevesi tarafından sağlanır ve geçersiz kılınabilir.
satın alabilirsiniz. Uygulama geliştiriciler, kullandıkları tema
Theme.DeviceDefault
Tutarlı bir kullanıcı deneyimi için mümkün olduğunda varsayılan vurguyu kullanın.
Özel şekilli (örneğin, yuvarlak veya hap şeklinde) bir odak vurgusu gerekiyorsa veya
Theme.DeviceDefault
kaynağından türetilmemiş bir tema kullanıyorsanız car-ui-library'ı kullanın
kullanarak her görünümde kendi odak noktanızı belirleyebilirsiniz.
Bir görünümde özel odak vurgusu belirlemek için arka planı veya ön plandaki çekilebilirliği değiştirin farklı bir görünüme çekmenizi sağlar. Genelde görebilirsiniz. Kare görünümün arka planı olarak kullanılan aşağıdaki çekilebilir yuvarlak bir odak vurgusu oluşturuyor:
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_focused="true" android:state_pressed="true"> <shape android:shape="oval"> <solid android:color="@color/car_ui_rotary_focus_pressed_fill_color"/> <stroke android:width="@dimen/car_ui_rotary_focus_pressed_stroke_width" android:color="@color/car_ui_rotary_focus_pressed_stroke_color"/> </shape> </item> <item android:state_focused="true"> <shape android:shape="oval"> <solid android:color="@color/car_ui_rotary_focus_fill_color"/> <stroke android:width="@dimen/car_ui_rotary_focus_stroke_width" android:color="@color/car_ui_rotary_focus_stroke_color"/> </shape> </item> <item> <ripple...> ... </ripple> </item> </selector>
(Android 11 QPR3, Android 11 Araba, Android 12) Örnekteki kalın kaynak referansları yukarıdaki, car-ui-library tarafından tanımlanan kaynakları tanımlar. OEM, tutarlı olmak için bunları geçersiz kılar vurgulamayı deneyin. Böylece odak vurgu renginin kullanıcı özel bir odak noktasıyla bir görünüm arasında gezindiğinde fırça genişliği ve diğer öğeler değişmiyor vurguyu ve varsayılan odak noktasının olduğu bir görünüm seçin. Son öğe, dokunmak için kullanılan bir dalgacık. Kalın karakterler için kullanılan varsayılan değerler şu şekilde görünür:
'nı inceleyin.Ayrıca, bir düğmeye sert bir şekilde aşağıdaki örnekte gösterildiği gibi, kullanıcının dikkatini çekecek şekilde bir arka plan rengi seçin. Bu da odaklanması zor görünür. Bu durumda, özel bir odak noktası oluşturmak için ikincil renkler:
- (Android 11 QPR3, Android 11 Araba,
Android 12)
car_ui_rotary_focus_fill_secondary_color
car_ui_rotary_focus_stroke_secondary_color
- (Android 12)
car_ui_rotary_focus_pressed_fill_secondary_color
car_ui_rotary_focus_pressed_stroke_secondary_color
Örnek:
Odaklanmış, basılmamış | Odaklanmış, basılı |
Döner kaydırma
Uygulamanızda RecyclerView
kullanılıyorsa
Bunun yerine CarUiRecyclerView
s. Böylece, kullanıcı arayüzünüzün
Çünkü bir OEM'nin özelleştirmesi tüm CarUiRecyclerView
ürünleri için geçerlidir.
Listenizdeki öğelerin tümüne odaklanılabiliyorsa başka bir işlem yapmanız gerekmez. Çevirmeli gezinme, odağı listedeki öğeler arasında taşır ve liste kaydırılır yeni odaklanılan öğeyi görünür hale getirir.
(Android 11 QPR3, Android 11 Araba,
Android 12)
Odaklanabilir olan ve odaklanılamayan
karmaşık bir durum
veya tüm öğeler odaklanamıyorsa çevirmeli kaydırmayı etkinleştirebilirsiniz. Böylece,
kullanıcının atlamadan listeyi kademeli olarak kaydırmak için çevirmeli kumandayı kullanmasını sağlar.
odaklanılamayacak öğeler. Çevirmeli kaydırmayı etkinleştirmek için app:rotaryScrollEnabled
ayarını yapın
özelliğini true
olarak tanımlar.
(Android 11 QPR3, Android 11 Araba,
Android 12)
Çevirmeli kaydırmayı istediğiniz
avCarUiRecyclerView
dahil olmak üzere kaydırılabilir görünüm
CarUiUtils
içinde setRotaryScrollEnabled()
yöntemi. Bunu yaptığınızda,
Yapmanız gerekenler:
- Kaydırılabilir görünümü odaklanılabilir hale getirerek, odaklanılabilir alt görünümlerin görünür olması,
- Kaydırılabilir görünümde varsayılan odaklamayı devre dışı bırakmak için şu numarayı arayın:
Kaydırılabilir görünümün görünmesi için
setDefaultFocusHighlightEnabled(false)
gözükmüyor. - Şu komutu çağırarak kaydırılabilir görünümün alt öğelerinden önce odaklandığından emin olun:
setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS)
SOURCE_ROTARY_ENCODER
ve şunlardan biriyle MotionEvents'i dinle: Kaydırılacak mesafeyi belirtmek içinAXIS_VSCROLL
veyaAXIS_HSCROLL
ve tıklayın.
CarUiRecyclerView
cihazında çevirmeli kaydırma etkinleştirildiğinde ve kullanıcı sayfayı döndürdüğünde
odaklanılabilir görünümün olmadığı bir alana gittiğinde, kaydırma çubuğu griden maviye dönüşür, sanki
kaydırma çubuğunun odaklanıldığını gösterir. İsterseniz benzer bir efekt uygulayabilirsiniz.
MotionEvents, farede bir kaydırma tekerleği tarafından oluşturulanlarla aynıdır. (kaynak hariç).
Doğrudan değiştirme modu
Normalde, otomatik hatırlatmalar ve döndürme, kullanıcı arayüzünde gezinirken ortadaki düğmeye basar. harekete geçin. Örneğin, bir kullanıcı ses seviyesi kaydırıcısına gitmek için çevirmeli kumandayı kullanabilir, Orta düğme, alarmın ses düzeyini ayarlamak için kumandayı döndürün ve ardından Geri düğmesine basın tuşuna basın. Buna doğrudan manipülasyon (DM) modu denir. Burada Bu durumda döner kumanda, gezinmek yerine görünümle doğrudan etkileşim kurmak için kullanılır.
DM'yi iki yöntemden biriyle uygulayın. Yalnızca döndürmeyi ve istediğiniz görünümü işlemeniz gerekiyorsa
manipüle etmek için ACTION_SCROLL_FORWARD
ve
ACTION_SCROLL_BACKWARD
AccessibilityEvent
öğelerini uygun şekilde kullanmak için
basit mekanizma. Aksi takdirde, gelişmiş mekanizmayı kullanın.
Sistem pencerelerinde tek seçenek basit mekanizmadır; uygulamaları her iki mekanizmayı da kullanabilir.
Basit mekanizma
(Android 11 QPR3, Android 11 Araba,
Android 12)
Uygulamanız
DirectManipulationHelper.setSupportsRotateDirectly(View view, boolean enable)
.
RotaryService
, kullanıcının DM modunda olduğunu algılar ve kullanıcı DM moduna girdiğinde
Bir görünüm odaklanılmışken Orta düğmeye basar. DM modundayken döndürmeler gerçekleştirilir
ACTION_SCROLL_FORWARD
veya ACTION_SCROLL_BACKWARD
ve DM modundan çıkar
Kullanıcı Geri düğmesine bastığında. Basit mekanizma, düğmenin seçili durumunu
giriş yaparken ve bu moddan çıkarken görünen görünümün üzerinde çalışır.
Kullanıcının DM modunda olduğuna dair görsel bir ipucu sağlamak için görünümünüzün farklı görünmesini sağlayın
seçildiğinde. Örneğin,
android:state_selected
true
.
Gelişmiş mekanizma
Uygulama, RotaryService
adlı çocuğun DM moduna ne zaman girip çıkacağını belirler. Tutarlı bir
kullanıcı deneyimi için, DM görünümü odaklı Orta düğmeye basıldığında DM moduna girilmelidir
ve Geri düğmesi DM modundan çıkacaktır. Ortadaki düğme ve/veya otomatik hatırlatma kullanılmıyorsa
bunlar, DM modundan çıkmak için alternatif yöntemler olabilir. Haritalar gibi uygulamalar için
DM, DM moduna girmek için kullanılabilir.
Gelişmiş DM modunu desteklemek için bir görünüm:
- (Android 11 QPR3, Android 11 Araba,
Android 12)
KEYCODE_DPAD_CENTER
için dinlemeniz GEREKİR DM moduna girmek ve DM modundan çıkmak için birKEYCODE_BACK
etkinliğini dinlemek her birindeDirectManipulationHelper.enableDirectManipulationMode()
aranıyor. Bu etkinlikleri dinlemek için aşağıdakilerden birini yapın:OnKeyListener
kaydettirin.
veya
- Görünümü genişletin ve ardından
dispatchKeyEvent()
yöntemini geçersiz kılın.
- Otomatik hatırlatma etkinliklerini dinlemeniz GEREKİR (
KEYCODE_DPAD_UP
,KEYCODE_DPAD_DOWN
,KEYCODE_DPAD_LEFT
veyaKEYCODE_DPAD_RIGHT
) otomatik hatırlatmaları kullanabilirsiniz. MotionEvent
dinlemek veAXIS_SCROLL
dilindeki rotasyon sayısını öğrenmek GEREKİR görünümün rotasyonu işlemek isteyip istemediğini seçin. Bunu birkaç şekilde yapabilirsiniz:OnGenericMotionListener
kaydettirin.- Görünümü genişletin ve
dispatchTouchEvent()
yöntemini geçersiz kılın.
- DM modunda takılı kalmamak için, Parça veya Etkinlik görüntülenirken DM modundan çıkılması ZORUNLUDUR etkileşimli değil.
- Görünümün DM modunda olduğunu belirtmek için görsel bir işaret SAĞLANMALIDIR.
Bir haritayı kaydırmak ve yakınlaştırmak için DM modunu kullanan özel bir görünüm örneği aşağıda verilmiştir:
/** Whether this view is in DM mode. */ private boolean mInDirectManipulationMode;
/** Initializes the view. Called by the constructors. */ private void init() { setOnKeyListener((view, keyCode, keyEvent) -> { boolean isActionUp = keyEvent.getAction() == KeyEvent.ACTION_UP; switch (keyCode) { // Always consume KEYCODE_DPAD_CENTER and KEYCODE_BACK events. case KeyEvent.KEYCODE_DPAD_CENTER: if (!mInDirectManipulationMode && isActionUp) { mInDirectManipulationMode = true; DirectManipulationHelper.enableDirectManipulationMode(this, true); setSelected(true); // visually indicate DM mode } return true; case KeyEvent.KEYCODE_BACK: if (mInDirectManipulationMode && isActionUp) { mInDirectManipulationMode = false; DirectManipulationHelper.enableDirectManipulationMode(this, false); setSelected(false); } return true; // Consume controller nudge events only when in DM mode. // When in DM mode, nudges pan the map. case KeyEvent.KEYCODE_DPAD_UP: if (!mInDirectManipulationMode) return false; if (isActionUp) pan(0f, -10f); return true; case KeyEvent.KEYCODE_DPAD_DOWN: if (!mInDirectManipulationMode) return false; if (isActionUp) pan(0f, 10f); return true; case KeyEvent.KEYCODE_DPAD_LEFT: if (!mInDirectManipulationMode) return false; if (isActionUp) pan(-10f, 0f); return true; case KeyEvent.KEYCODE_DPAD_RIGHT: if (!mInDirectManipulationMode) return false; if (isActionUp) pan(10f, 0f); return true; // Don't consume other key events. default: return false; } });
// When in DM mode, rotation zooms the map. setOnGenericMotionListener(((view, motionEvent) -> { if (!mInDirectManipulationMode) return false; float scroll = motionEvent.getAxisValue(MotionEvent.AXIS_SCROLL); zoom(10 * scroll); return true; })); }
@Override public void onPause() { if (mInDirectManipulationMode) { // To ensure that the user doesn't get stuck in DM mode, disable DM mode // when the fragment is not interactive (e.g., a dialog shows up). mInDirectManipulationMode = false; DirectManipulationHelper.enableDirectManipulationMode(this, false); } super.onPause(); }
Şurada daha fazla örnek bulabilirsiniz:
RotaryPlayground
projesi.
Etkinlik Görünümü
ActivityView kullanırken:
ActivityView
odaklanılabilir olmamalıdır.- (Android 11 QPR3, Android 11 Araba,
Android 11'de desteği sonlandırıldı)
ActivityView
içeriğininFocusParkingView
İÇERmesi ZORUNLUDUR ilk odaklanabilir görünüm olarak veapp:shouldRestoreFocus
özelliğininfalse
olması ZORUNLUDUR. ActivityView
içeriğindeandroid:focusByDefault
görüntüleme.
Kullanıcı için, ActivityViews'un odak dışında gezinme üzerinde hiçbir etkisi olmamalıdır.
alanları ActivityViews öğesine yayılamaz. Diğer bir deyişle,
ActivityView
içinde ve dışında içerik barındırıyor. Eklemez
herhangi bir FocusAreas'ı kullanarak, ActivityView
içindeki görünüm hiyerarşisinin kökü
ActivityView
, örtülü bir odak alanı olarak kabul edilir.
Basılı tutulduğunda çalışan düğmeler
Çoğu düğme tıklandığında bazı işlemlere neden olur. Bazı düğmeler basılı tutulduğunda çalışır.
Örneğin, Hızlı İleri ve Geri Sar düğmeleri genellikle basılı tutulduğunda çalışır. Böyle bir durumda
düğmeler çevirmeyi destekliyor, KEYCODE_DPAD_CENTER
KeyEvents
için dinle
şu şekildedir:
mButton.setOnKeyListener((v, keyCode, event) -> { if (keyCode != KEYCODE_DPAD_CENTER) { return false; } if (event.getAction() == ACTION_DOWN) { mButton.setPressed(true); mHandler.post(mRunnable); } else { mButton.setPressed(false); mHandler.removeCallbacks(mRunnable); } return true; });
mRunnable
adlı kullanıcının bir işlem gerçekleştirdiği (geri sarma gibi) ve kendini
çalıştırılabilir.
Dokunma modu
Kullanıcılar bir arabadaki ana birimle iki şekilde etkileşim kurmak için döner kumanda kullanabilir. çevirmeli kumandayı kullanarak veya ekrana dokunarak indirebilir. Çevirmeli kumandayı kullanırken odaklanılabilir görünümlerden biri vurgulanıyor. Ekrana dokunduğunuzda odak vurgusu yok görünür. Kullanıcı istediği zaman şu giriş modları arasında geçiş yapabilir:
- Döner → dokunma. Kullanıcı ekrana dokunduğunda odak vurgusu kaybolur.
- &döndürün. Kullanıcı ortadaki düğmeyi hareket ettirdiğinde, döndürdüğünde veya düğmeye bastığında odak vurgusu görünür.
Geri ve Ana sayfa düğmelerinin giriş modu üzerinde herhangi bir etkisi yoktur.
Android'in mevcut konsepti üzerine dönen bindirmeler
dokunmatik modunu kullanabilirsiniz.
Tekliflerinizi otomatikleştirmek ve optimize etmek için
View.isInTouchMode()
.
kullanıcının hangi giriş modunu kullandığını belirler. Tekliflerinizi otomatikleştirmek ve optimize etmek için
OnTouchModeChangeListener
.
dinlemenizi öneririz. Bu özellik, kullanıcı arayüzünüzü mevcut
kafa karıştırıcı olabileceğinden büyük değişikliklerden kaçının.
Sorun giderme
Dokunma için tasarlanmış uygulamalarda, iç içe odaklanılabilir görünümlerin bulunması yaygın bir durumdur.
Örneğin, ImageButton
çevresinde bir FrameLayout
olabilir,
ve her ikisine de odaklanılabilir. Bu, dokunmaya zarar vermez ancak kötü bir deneyime neden olabilir
Kullanıcının oyuna geçmek için kumandayı iki kez döndürmesi gerektiğinden döndürme için kullanıcı deneyimi
görünümüne geçiyorum. Google, iyi bir kullanıcı deneyimi için
dış görünüm veya iç görünüm odaklanılabilir.
Çevirmeli kumandayla basıldığında bir düğme veya anahtara odaklanma kaybedilirse şu koşullar geçerli olabilir:
- Düğme veya anahtar,
çok önemli. Her iki durumda da, bu sorunu çözmenin iki yolu vardır:
android:enabled
durumunutrue
olarak bırakın ve özel bir durum kullanın devre dışı bırakın veya aşağıdaki adımları izleyin: Özel Durum.- Düğmeyi veya anahtarı çevrelemek ve kapsayıcıyı odaklanılabilir hale getirmek için bir kapsayıcı kullanın düğmesi veya anahtarı yerine. (Tıklama işleyici kapsayıcıda olmalıdır.)
- Düğme veya anahtar değiştiriliyor. Örneğin, düğme tıklandığında yapılan işlem
tuşuna basıldığında veya anahtara geçildiğinde, kullanılabilir işlemlerin yenilenmesi tetiklenebilir.
ve yeni düğmelerin mevcut düğmelerin yerini almasına neden oluyor. Bu sorunu çözmenin iki yolu vardır:
- Yeni bir düğme veya anahtar oluşturmak yerine sayfanın simgesini ve/veya metnini ayarlayın. Mevcut düğme veya anahtar.
- Yukarıda olduğu gibi, düğmenin veya anahtarın etrafına odaklanılabilir bir kapsayıcı ekleyin.
Döner Oyun Alanı
RotaryPlayground
, çevirme için bir referans uygulamadır. Nasıl entegre edeceğinizi öğrenmek için
özellikleri uygulamalarınıza dönüştürebilirsiniz. RotaryPlayground
, emülatör derlemelerine ve
Android Automotive OS (AAOS) çalıştıran cihazlar için derlemeler.
RotaryPlayground
deposu:packages/apps/Car/tests/RotaryPlayground/
- Sürümler: Android 11 QPR3, Android 11 Car, ve Android 12
RotaryPlayground
uygulaması solda şu sekmeleri gösterir:
- Kartlar. Odaklanamayan öğeleri atlayarak odak alanlarında gezinmeyi deneyin ve metin girişi.
- Doğrudan Manipülasyon. Basit ve gelişmiş özellikleri destekleyen widget'ları test etme doğrudan manipülasyon moduna girer. Bu sekme, özellikle Uygulama penceresi
- Sys Kullanıcı Arayüzü Manipülasyonu. Doğrudan manipülasyonu destekleyen widget'ları test etme Yalnızca basit doğrudan işleme modunun desteklendiği sistem pencerelerinde.
- Izgara. Kaydırma işleviyle z deseni döndürmeli gezinmeyi test edin.
- Bildirim. Uyarı bildirimlerini otomatik hatırlatma ve devre dışı bırakma işlemlerini test edin.
- Kaydırma. Kaydırma işlemini, odaklanılabilir ve odaklanılabilir olmayan bir karışımla test edin içerik.
- Web Görünümü.
WebView
içindeki bağlantılar arasında gezinmeyi test edin. - Özel
FocusArea
.FocusArea
özelleştirmesini test edin:- Projeyi tamamlayın.
android:focusedByDefault
veapp:defaultFocus
.
- Açık otomatik hatırlatma hedefleri.
- Kısayolları sürükle.
- Odaklanabilir görünüm içermeyen
FocusArea
.