Bu sayfada, VHAL'de döner girişlerin nasıl işleneceği, yapınızın döner hizmetini içerecek şekilde nasıl yapılandırılacağı ve tüm uygulamalarda döner deneyiminin nasıl özelleştirileceği açıklanmaktadır. OEM tarafından sağlanan başlatıcı gibi önceden yüklenmiş OEM uygulamaları için bkz . Araç Kullanıcı Arayüzü Kitaplığı (araç kullanıcı arayüzü kitaplığı) .
VHAL
Döner denetleyici aşağıdaki eylemleri destekler:
- Yukarı, aşağı, sola ve sağa itin.
- Saat yönünde ve saat yönünün tersine döndürün.
- Orta düğmeye basın.
- Geri tuşuna basınız.
- Ana sayfa düğmesine basın.
- Telefon ve Medya gibi diğer düğmelere basın.
Sistem özellikleri ve karşılık gelen int32Values
ile ilgili belgeler için hardware/interfaces/automotive/vehicle/2.0/types.hal
bakın.
VHAL şu eylemleri gerçekleştirmelidir:
Dürtmek
Kullanıcı döner denetleyiciye sağa bastığında VHAL, Android'e bir olay göndermek için aşağıdaki int32Values
ile HW_KEY_INPUT
özelliğini kullanmalıdır:
-
ACTION_DOWN
-
KEYCODE_SYSTEM_NAVIGATION_RIGHT
- Hedef gösterimi.
Kullanıcı döner denetleyiciyi bıraktığında VHAL, ACTION_UP
ile aynı özelliği ve anahtar kodu kullanmalıdır. Diğer yönlerdeki dürtüklemelerde karşılık gelen anahtar kodlar kullanılmalıdır.
Köşegenler için anahtar kodlar yoktur ancak donanım köşegenleri destekliyorsa VHAL, çapraz oluşturmak için yatay ve dikey bir olayı birleştirebilir. Örneğin, yukarıya ve sola doğru itmek şunu üretmelidir:
-
HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_LEFT ACTION_DOWN
-
HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_UP ACTION_DOWN
Her iki sırada (ve sonrasında) döner kontrolörün serbest bırakılması şunları üretmelidir:
-
HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_LEFT ACTION_UP
-
HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_UP ACTION_UP
Kullanıcı, serbest bırakmadan önce döner kumandayı dik yönde itebilir. Örneğin aşağıdaki senaryo:
Bu, aşağıdaki olay dizisini oluşturmalıdır:
-
HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_LEFT ACTION_DOWN
-
HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_UP ACTION_DOWN
-
HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_LEFT ACTION_UP
-
HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_UP ACTION_UP
Döner kontrol cihazı bir yönde tutulduğunda hiçbir tekrar olayı oluşturulmamalıdır.
Döndür
Kullanıcı döner denetleyiciyi saat yönünde bir kilit kadar döndürdüğünde (tıkladığında), VHAL, Android'e bir olay göndermek için aşağıdaki int32Values
ile HW_ROTARY_INPUT
özelliğini kullanmalıdır:
-
ROTARY_INPUT_TYPE_SYSTEM_NAVIGATION
- Bir (1) gözaltı.
- Hedef gösterimi.
Olayın zaman damgası nanosaniye cinsinden geçen süreye ayarlanmalıdır.
Bir (1) mandalın saat yönünün tersine dönmesi aynı olayı oluşturmalıdır ancak mandal sayısı -1 olmalıdır.
Aynı yönde birden fazla dönüş tetiklemesi hızlı bir şekilde art arda meydana gelirse, VHAL, sistemi olaylarla aşırı yüklememek için tetiklemeleri tek bir olayda birleştirmelidir. Bu durumda olayın zaman damgası, rotasyonun ilk engellenmesinin gerçekleştiği zaman olmalıdır. int32Values
, ardışık dönüş tetiklemeleri arasındaki nanosaniye sayısını içermelidir.
Örneğin aşağıdaki rotasyon sırası:
- t0 zamanında, kullanıcı bir mandalı saat yönünün tersine döndürdü.
- t0 + 5 ns zamanında, kullanıcı bir mandalı saat yönünün tersine döndürdü.
- t0 + 8 ns zamanında, kullanıcı bir mandalı saat yönünün tersine döndürdü.
bu olayı oluşturmalıdır:
- Özellik:
HW_ROTARY_INPUT
- Zaman damgası:
t0
-
int32Values
:-
ROTARY_INPUT_TYPE_SYSTEM_NAVIGATION
- -3 (saat yönünün tersine üç tetik).
- Hedef gösterimi.
- Birinci ve ikinci tetikleme arasında 5 ns.
- İkinci ve üçüncü tetikleme arasında 3 ns.
-
Orta düğme
Kullanıcı Center düğmesine bastığında VHAL, Android'e bir olay göndermek için aşağıdaki int32Values
ile HW_KEY_INPUT
özelliğini kullanmalıdır:
-
ACTION_DOWN
-
KEYCODE_DPAD_CENTER
- Hedef gösterimi.
Kullanıcı döner denetleyiciyi bıraktığında VHAL, ACTION_UP
ile aynı özelliği ve anahtar kodu kullanmalıdır.
Ortadaki düğme basılı tutulduğunda tekrarlanan olaylar oluşturmayın.
Geri butonu
Kullanıcı Geri düğmesine bastığında VHAL, Android'e bir olay göndermek için aşağıdaki int32Values
ile HW_KEY_INPUT
özelliğini kullanmalıdır:
-
ACTION_DOWN
-
KEYCODE_BACK
- Hedef gösterimi.
Kullanıcı döner denetleyiciyi bıraktığında VHAL, ACTION_UP
ile aynı özelliği ve anahtar kodu kullanmalıdır.
Ortadaki düğme basılı tutulduğunda hiçbir tekrar olayı oluşturulmamalıdır.
Ana menü tuşu
Ana Sayfa düğmesini Geri düğmesinde yaptığınız gibi kullanın, ancak KEYCODE_BACK
yerine KEYCODE_HOME
kullanın.
Diğer düğmeler
Döner denetleyici herhangi bir ek düğme içeriyorsa, VHAL bunları, Android açısından bakıldığında rotary'in bir parçası olarak kabul edilmedikleri için OEM'in hoşuna gidecek şekilde yönetebilir. Bunlar genellikle Geri ve Ana Sayfa düğmeleri gibi kullanılır ancak farklı tuş kodlarıyla kullanılır. Örneğin, KEYCODE_CALL
veya KEYCODE_MUSIC
.
Yapı yapılandırması
Döner navigasyon, RotaryService
adı verilen bir erişilebilirlik hizmeti tarafından sağlanır. Bu hizmeti cihazınızın sistem görüntüsüne dahil etmek için makefile'ınıza aşağıdaki satırı ekleyin:
PRODUCT_PACKAGES += CarRotaryController
Aşağıdaki paketleri de hata ayıklama yapılarına dahil etmek isteyebilirsiniz:
-
RotaryPlayground
Döner için bir referans uygulaması (bkz. RotaryPlayground ). -
RotaryIME
Bir demo döner IME (bkz . Giriş Yöntemi Düzenleyicileri ). -
CarRotaryImeRRO
RotaryIME
için kaplama.
Cihaz önyüklendiğinde ve kullanıcı değişikliği gerçekleştiğinde döner hizmet otomatik olarak etkinleştirilir. Bu, kullanıcının kurulum sırasında döner denetleyiciyi kullanabilmesini sağlar.
Döner kumandalı ve kumandasız araçlar için aynı yapıyı kullanıyorsanız, gerekli kodun yapıya dahil edilmesi için yukarıda gösterildiği gibi CarRotaryController
ekleyin. Döner hizmetin döner olmayan araçlarda etkinleştirilmesini önlemek için, packages/services/Car/service
içindeki rotaryService
dize kaynağını boş bir dizeyle kaplamak için statik bir RRO oluşturun. Döner ve dönmeyen cihazlar için aynı yapıyı kullanacak ancak farklı ürün konfigürasyonlarına sahip olacaksınız. Yalnızca ikincisi kaplamayı içerir.
Özelleştirme
OEM'ler aşağıdaki konumlardaki kaynak katmanları aracılığıyla odak bulma mantığını, odak vurgusunu ve bazı ek öğeleri özelleştirebilir:
- car-ui-kütüphanesi
packages/apps/Car/libs/car-ui-lib
bulunur -
RotaryService
packages/apps/Car/RotaryController
bulunur -
Core
frameworks/base/core
bulunur
Dürtme geçmişi
OEM, iki tür itme geçmişinin her birinin etkinleştirilip etkinleştirilmeyeceğini ve eğer öyleyse, önbellek boyutunu ve süre sonu ilkesini yapılandırabilir. Bunların hepsi çeşitli araç kullanıcı arayüzü kitaplığı kaynaklarının geçersiz kılınmasıyla yapılır.
Geçmiş önbelleğine odaklan
( Android 11 QPR3, Android 11 Araba, Android 12 )
Bu FocusArea
başına önbellek, FocusArea
içinde en son odaklanılan görünümü saklar, böylece FocusArea
geri dönüldüğünde odaklanılabilir. Bu önbellek, aşağıdaki araç kullanıcı arayüzü kitaplığı kaynaklarının üst üste bindirilmesiyle yapılandırılabilir:
-
car_ui_focus_history_cache_type
:- Önbellek devre dışı bırakıldı.
- Önbelleğin süresi bir süre sonra dolacaktır (aşağıya bakın).
- Önbelleğin süresi hiçbir zaman dolmaz.
-
car_ui_focus_history_expiration_period_ms
: Önbellek türü iki (2) olarak ayarlanırsa önbelleğin süresinin dolmasına kaç milisaniye kalır (yukarıya bakın).
FocusArea geçmiş önbelleği
( Android 11 QPR3, Android 11 Araba, Android 12 )
Bu önbellek, ters yönde dürtmelerin odağı aynı FocusArea
döndürebilmesi için dürtmelerin geçmişini saklar. Bu önbellek, aşağıdaki araç kullanıcı arayüzü kitaplığı kaynaklarının üst üste bindirilmesiyle yapılandırılabilir:
-
car_ui_focus_area_history_cache_type
:- Önbellek devre dışı bırakıldı.
- Önbelleğin süresi bir süre sonra dolar (aşağıya bakın).
- Önbellek hiçbir zaman sona ermez.
-
car_ui_focus_area_history_expiration_period_ms
: Önbellek türü 2 olarak ayarlanırsa önbelleğin süresinin dolmasına kaç milisaniye kaldı (yukarıya bakın). -
car_ui_clear_focus_area_history_when_rotating
: Kullanıcı denetleyiciyi döndürdüğünde önbelleğin iptal edilip edilmeyeceği.
Döndürme
( Android 11 QPR3, Android 11 Araba, Android 12 )
OEM, rotasyon için fare ivmesi gibi bir ivmenin olup olmadığını belirtmek için RotaryService
iki tam sayı kaynağını geçersiz kılabilir:
-
rotation_acceleration_3x_ms
: Google'ın belirli bir dönüş süresi için denetleyici dönüşünü hızlandırıp hızlandırmayacağına karar vermek için kullanılan zaman aralığı (milisaniye cinsinden). Bu tetikleme noktası ile önceki dönüş tetiklemesi arasındaki aralık bu değerden küçükse, üç dönme tetiklemesi olarak ele alınacaktır. 3× hızlandırmayı devre dışı bırakmak için bunu 2147483647 olarak ayarlayın. -
rotation_acceleration_2x_ms
:rotation_acceleration_3x_ms
benzer. 2x hızlanma için kullanılır. 2× hızlandırmayı devre dışı bırakmak için bunu2147483647
olarak ayarlayın.
Hızlanma, VHAL'in gerektirdiği şekilde, her dönüş tetikleyicisi için ayrı zaman damgaları olduğunda en iyi sonucu verir. Bunlar mevcut değilse, RotaryService
dönme mandallarının eşit aralıklarla yerleştirildiğini varsayar.
/** * Property to feed H/W rotary events to android * * int32Values[0] : RotaryInputType identifying which rotary knob rotated * int32Values[1] : number of detents (clicks), positive for clockwise, * negative for counterclockwise * int32Values[2] : target display defined in VehicleDisplay. Events not * tied to specific display must be sent to * VehicleDisplay#MAIN. * int32values[3 .. 3 + abs(number of detents) - 2]: * nanosecond deltas between pairs of consecutive detents, * if the number of detents is > 1 or < -1 * * VehiclePropValue.timestamp: when the rotation occurred. If the number of * detents is > 1 or < -1, this is when the * first detent of rotation occurred. * * @change_mode VehiclePropertyChangeMode:ON_CHANGE * @data_enum RotaryInputType * @access VehiclePropertyAccess:READ */ HW_ROTARY_INPUT = ( 0x0A20 | VehiclePropertyGroup:SYSTEM | VehiclePropertyType:INT32_VEC | VehicleArea:GLOBAL),
Odaklanma vurgusu
OEM, Android çerçevesindeki varsayılan odak vurgusunu ve araç-ui-kitaplığındaki çeşitli odak vurgulama kaynaklarını geçersiz kılabilir.
Varsayılan odak vurgusu
Android çerçevesi, selectableItemBackground
özelliği aracılığıyla varsayılan bir odak vurgusu sağlar. Theme.DeviceDefault
bu öznitelik, Core
item_background.xml
dosyasına başvurur. OEM, çizilebilir varsayılan odak vurgusunu değiştirmek için item_background.xml
dosyasını kaplayabilir.
Bu çekilebilir genellikle, android:state_focused
ve android:state_pressed
dahil olmak üzere farklı durum kombinasyonlarına göre arka planı ayarlayan bir StateListDrawable
olmalıdır. Kullanıcı bir görünüme odaklanmak için döner denetleyiciyi kullandığında, android:state_focused
true
olacaktır, ancak android:state_pressed
false
olacaktır. Kullanıcı daha sonra döner denetleyici üzerindeki Orta düğmeye basarsa, kullanıcı düğmeyi basılı tuttuğu sürece hem android:state_focused
hem de android:state_pressed
true
olacaktır. Kullanıcı düğmeyi bıraktığında yalnızca android:state_focused
true
kalacaktır.
car-ui-library, Theme.DeviceDefault
öğesinden türetilen bir temayı kullanır. Sonuç olarak bu yer paylaşımı, bu kitaplığı kullanan uygulamaları ve Theme.DeviceDefault
öğesinden türetilen herhangi bir temayı kullanan uygulamaları etkiler. Theme.Material
gibi ilgisiz bir tema kullanan uygulamaları etkilemez.
Araç kullanıcı arayüzü kütüphanesindeki kaynakları vurgulamaya odaklanın
OEM, dikdörtgen olmayan (yuvarlak veya hap şeklinde) odak vurgusu olan görünümlerde ve Theme.DeviceDefault
türetmeyen bir tema kullanan uygulamalarda odak vurgusunun nasıl görüneceğini kontrol etmek için çeşitli araç kullanıcı arayüzü kitaplığı kaynaklarını geçersiz kılabilir Theme.DeviceDefault
. Bu kaynaklar, odak vurgusunun çizilebilir varsayılan odak vurgusu ile tutarlı olması için üst üste yerleştirilmelidir.
( Android 11 QPR3, Android 11 Araba, Android 12 )
Bir görünüme odaklanıldığını ancak basılmadığını belirtmek için aşağıdaki kaynaklar kullanılır:
-
car_ui_rotary_focus_fill_color
: Dolgu rengi. -
car_ui_rotary_focus_stroke_color
: Anahat rengi. -
car_ui_rotary_focus_stroke_width
: Ana hattın kalınlığı.
( Android 11 QPR3, Android 11 Araba, Android 12 )
Bir görünüme ne zaman odaklanıldığını ve basıldığını belirtmek için aşağıdaki kaynaklar kullanılır:
-
car_ui_rotary_focus_pressed_fill_color
: Dolgu rengi. -
car_ui_rotary_focus_pressed_stroke_color
: Anahat rengi. -
car_ui_rotary_focus_pressed_stroke_width
: Ana hattın kalınlığı.
Bazen, gösterilen örnekte olduğu gibi, kullanıcının dikkatini çekmek için bir düğmeye düz bir arka plan rengi verilir. Bu, odak vurgusunun görülmesini zorlaştırabilir.
Bu durumda geliştirici, ikincil renkleri kullanarak özel bir odak vurgusu belirtebilir:- ( 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
Örneğin yalnızca dolgu veya yalnızca dış hat istiyorsanız, renklerden herhangi biri şeffaf olabilir ve her iki boyut da sıfır olabilir.
Odak Alanı vurgusu
( Android 11 QPR3, Android 11 Araba, Android 12 )
FocusArea
alt öğelerinden birine odaklanıldığında iki tür vurgu çizebilir. İstenildiği takdirde her ikisi bir arada kullanılabilir. Bu özellik AOSP'de varsayılan olarak devre dışıdır ancak araç kullanıcı arayüzü kitaplığı kaynakları geçersiz kılınarak etkinleştirilebilir:
-
car_ui_enable_focus_area_foreground_highlight
:FocusArea
ve alt öğelerinin üstüne bir vurgu çizin. AOSP'de bu çizilebilir,FocusArea
etrafındaki bir taslaktır. OEM'lercar_ui_focus_area_foreground_highlight
çizilebilirliğini geçersiz kılabilir. -
car_ui_enable_focus_area_background_highlight
:FocusArea
üstüne ancak alt öğelerinin arkasına bir vurgu çizin. AOSP'de bu çekilebilir, katı bir dolgudur. OEM'lercar_ui_focus_area_background_highlight
çizilebilirliğini geçersiz kılabilir.
Giriş Yöntemi Düzenleyicileri
Giriş Yöntemi Düzenleyicileri (IME) giriş yöntemleridir. Örneğin, bir ekran klavyesi.
( Android 11 QPR3, Android 11 Araba, Android 12 )
OEM, dokunmatik tabanlı IME'nin ComponentName
belirtmek için RotaryService
default_touch_input_method
dize kaynağını kaplamalıdır. Örneğin, OEM, Android Automotive ile sağlanan IME'yi kullanıyorsa com.google.android.apps.automotive.inputmethod/.InputMethodService
belirtmelidir.
( Android 11 QPR3, Android 11 Araba, Android 12 )
OEM, özellikle rotary için bir IME oluşturduysa, bunun ComponentName
rotary_input_method
kaynağında belirtmesi gerekir. Bu kaynak yer paylaşımlıysa belirtilen IME, kullanıcı döner denetleyicinin itme, döndürme ve Orta düğmesi aracılığıyla ana üniteyle etkileşimde bulunduğunda kullanılır. Kullanıcı ekrana dokunduğunda önceki IME kullanılacaktır. Geri düğmesinin (ve döner denetleyicideki diğer düğmelerin) IME seçimi üzerinde hiçbir etkisi yoktur. Bu kaynak yer paylaşımlı değilse IME geçişi gerçekleşmez. Carboard döneri desteklemediğinden, OEM döner IME sağlamadıysa kullanıcı döner denetleyici aracılığıyla metin giremez.
RotaryIME
bir demo döner IME'dir. Temel olsa da yukarıda açıklanan otomatik IME değiştirmeyi denemek yeterlidir. RotaryIME
kaynak kodu packages/apps/Car/tests/RotaryIME/
konumunda bulunabilir.
Ekran dışı dürtüklemeler
Varsayılan olarak, kullanıcı ekranın kenarından çıkmaya çalıştığında hiçbir şey olmuyor. OEM, aşağıdakilerin herhangi bir kombinasyonunu belirterek dört yönün her biri için ne olması gerektiğini yapılandırabilir:
-
AccessibilityService
tarafından tanımlanan genel bir eylem. Örneğin,GLOBAL_ACTION_BACK
. -
KEYCODE_BACK
gibi bir anahtar kodu. - URL olarak temsil edilen bir etkinliği başlatma niyeti.
( Android 11 QPR3, Android 11 Araba, Android 12 )
Bunlar, RotaryService
aşağıdaki dizi kaynaklarının üst üste bindirilmesiyle belirtilir:
-
off_screen_nudge_global_actions
: Kullanıcı ekranın kenarından yukarı, aşağı, sola veya sağa doğru ittiğinde gerçekleştirilecek genel eylemler dizisi. Bu dizinin ilgili elemanı -1 ise hiçbir global eylem gerçekleştirilmez. -
off_screen_nudge_key_codes
: Kullanıcı ekranın kenarından yukarı, aşağı, sola veya sağa doğru ittiğinde eklenecek tıklama etkinliklerinin anahtar kodlarının dizisi. Bu dizinin ilgili öğesi 0 (KEYCODE_UNKNOWN
) ise hiçbir olay enjekte edilmez. -
off_screen_nudge_intents
: Kullanıcı ekranın kenarından yukarı, aşağı, sola veya sağa doğru ittiğinde bir etkinliği başlatacak niyet dizisi. Bu dizinin ilgili elemanı boşsa hiçbir aktivite başlatılmaz.
Diğer konfigürasyonlar
Aşağıdaki RotaryService
kaynaklarını eklemelisiniz:
- ( Android 11 QPR3, Android 11 Araba, Android 12 )
config_showHeadsUpNotificationOnBottom
: Uyarı bildirimlerinin üstte değil altta gösterilmesi gerekip gerekmediğini temsil eden Boolean değeri. Buframeworks/base/packages/CarSystemUI/res/values/config.xml
dosyasındakiconfig_showHeadsUpNotificationOnBottom
Boolean kaynağıyla aynı değere sahip olmalıdır. - ( Android 11 QPR3, Android 11 Araba, Android 12 )
notification_headsup_card_margin_horizontal
: Uyarı bildirim penceresinin sol ve sağ kenar boşluğu. Bupackages/apps/Car/Notification/res/values/dimens.xml
notification_headsup_card_margin_horizontal
dimen kaynağıyla aynı değere sahip olmalıdır. - ( Android 12 )
excluded_application_overlay_window_titles
: Yer paylaşımlı pencere olarak kabul edilmemesi gereken pencerelerin başlıklarından oluşan bir dizi. Bu,TaskViews
veyaTaskDisplayAreas
temsil eden uygulama pencerelerinin başlıklarını içermelidir. Varsayılan olarak bu liste yalnızca "Haritalar"ı içerir.
Aşağıdaki RotaryService
kaynağını kaplayabilirsiniz:
- ( Android 11 QPR3, Android 11 Araba, Android 12 )
long_press_ms
: Uzun basmayı tetiklemek için Ortadaki düğmenin kaç milisaniye basılı tutulması gerektiğini temsil eden tamsayı değeri. Sıfır, sistem varsayılan uzun basma zaman aşımının kullanılması gerektiğini belirtir. Bu varsayılan değerdir.