Uygulama geliştirme

Aşağıdaki materyal, uygulama geliştiriciler içindir.

Uygulamanızın çevirmelini desteklemesi için şunları yapmanız GEREKİR:

  1. İlgili etkinlik düzenine bir FocusParkingView yerleştirin.
  2. Odaklanabilir olan (veya olmayan) görünümlere emin olun.
  3. Ş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:

  1. Araç çubuğunun altındaki üç noktaya dokunun:

    Emülasyonlu döner kumandaya erişim
    Şekil 1. Emülasyonlu döner kumandaya erişim
    'nı inceleyin.
  2. Genişletilmiş kontroller penceresinde Arabayı döndürme'yi seçin:

    Araba çevirmesini seçin
    Şekil 2. Araba çevirmesini 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 veya eng 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:

  1. 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.
  2. Geçerli pencerede yalnızca bir FocusArea varsa kumandayı döndürün FocusArea 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.
  3. Ç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:

  1. Ö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>
    
  2. 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;
    }
    
    .
  3. 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);
    
    .
  4. 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;
    }
    
    .
  5. 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.
  6. 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 yerine app:state_rotary_enabled. Henüz yapmadıysanız şunları eklemeniz gerekir:
    xmlns:app="http://schemas.android.com/apk/res-auto"
    
    .
  7. Görünümünüz herhangi bir düzende devre dışı bırakılırsa android:enabled="false" öğesini app:state_rotary_enabled="false" ve ardından app ad alanını ekleyin. Yukarıdakiyle aynı.
  8. Görünümünüz programatik olarak devre dışı bırakıldıysa çağrıları setEnabled() ile değiştirin setRotaryEnabled() 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:

  1. RotaryService, döndürme ve sürükleme işlemlerini işlerken örnekleri arar görünüm hiyerarşisinde FocusArea.
  2. 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.
  3. Otomatik hatırlatma etkinliği alınırken RotaryService, odağı başka bir görünüme taşır başka bir FocusArea 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çin app: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çinde app: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.

  1. (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
  2. (Android 11 QPR3, Android 11 Araba, Android 12)
    app:defaultFocusOverridesHistory değeri true olarak ayarlanabilir. Böylece, bu FocusArea başka bir görüntülemeye odaklanılmıştı.
  3. (Android 12)
    Şunu kullan: app:nudgeLeftShortcut, app:nudgeRightShortcut, app:nudgeUpShortcut ve app: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 ve app:nudgeShortcutDirection yalnızca bir tane otomatik hatırlatma kısayolunu destekliyor.

  4. (Android 11 QPR3, Android 11 Araba, Android 12)
    Döndürmeyi bu FocusArea içinde sarmalamak üzere etkinleştirmek için app:wrapAround true olarak ayarlanabilir. Bu, genellikle görüntülemeler oval ya da oval olabilir.
  5. (Android 11 QPR3, Android 11 Araba, Android 12)
    Vurgulamanın dolgusunu bu FocusArea, app:highlightPaddingStart kullanın, app:highlightPaddingEnd, app:highlightPaddingTop, app:highlightPaddingBottom, app:highlightPaddingHorizontal, ve app:highlightPaddingVertical.
  6. (Android 11 QPR3, Android 11 Araba, Android 12)
    Otomatik hatırlatma hedefi bulmak amacıyla bu FocusArea öğesinin algılanan sınırlarını ayarlamak için: şunu kullanın: app:startBoundOffset, app:endBoundOffset, app:topBoundOffset, app:bottomBoundOffset, app:horizontalBoundOffset ve app:verticalBoundOffset.
  7. (Android 11 QPR3, Android 11 Araba, Android 12)
    Bir belirtilen yönlerde bitişik FocusArea (veya alanlar) için app:nudgeLeft, app:nudgeRight, app:nudgeUp ve app: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 sürükle kısayolu
Şekil 3. Otomatik sürükle kısayolu
'nı inceleyin.

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:

Kalın yazı tipi kaynakları için varsayılan değerler
Şekil 4. Kalın yazı tipi kaynakları için varsayılan değerler
'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:

Düz arka plan rengi
  • (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ış Konsantrasyonlu, basılı
Odaklanmış, basılmamış Odaklanmış, basılı

Döner kaydırma

Uygulamanızda RecyclerView kullanılıyorsa Bunun yerine CarUiRecyclerViews. 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çin AXIS_VSCROLL veya AXIS_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:

  1. (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 bir KEYCODE_BACK etkinliğini dinlemek her birinde DirectManipulationHelper.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.
  2. Otomatik hatırlatma etkinliklerini dinlemeniz GEREKİR (KEYCODE_DPAD_UP, KEYCODE_DPAD_DOWN, KEYCODE_DPAD_LEFT veya KEYCODE_DPAD_RIGHT) otomatik hatırlatmaları kullanabilirsiniz.
  3. MotionEvent dinlemek ve AXIS_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:
    1. OnGenericMotionListener kaydettirin.
    2. Görünümü genişletin ve dispatchTouchEvent() yöntemini geçersiz kılın.
  4. DM modunda takılı kalmamak için, Parça veya Etkinlik görüntülenirken DM modundan çıkılması ZORUNLUDUR etkileşimli değil.
  5. 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ğinin FocusParkingView İÇERmesi ZORUNLUDUR ilk odaklanabilir görünüm olarak ve app:shouldRestoreFocus özelliğinin false olması ZORUNLUDUR.
  • ActivityView içeriğinde android: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 durumunu true 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 ve app:defaultFocus
    • .
    • Açık otomatik hatırlatma hedefleri.
    • Kısayolları sürükle.
    • Odaklanabilir görünüm içermeyen FocusArea.