Personalizando CarUiRecyclerView

Este artigo descreve o processo de personalização CarUiRecyclerView e da barra de rolagem.

Pré-requisitos

Este artigo pressupõe o conhecimento de um APK de destino Runtime Resource Overlay (RRO). Para saber mais, consulte Personalizando aplicativos .

Sobre CarUiRecyclerView

Quando car_ui_scrollbar_enable é definido como false em bools.xml , CarUiRecyclerView não inflará a barra de rolagem. Dito isso, apenas o androidx.recyclerview é inflado com estilos personalizáveis, conforme definido abaixo. Quando car_ui_scrollbar_enable é definido como true , CarUiRecyclerView inflará o contêiner com a barra de rolagem instalada dentro dele. Posteriormente, androidx.recyclerview também será adicionado ao mesmo contêiner.

CarUiRecyclerView pode usar qualquer adaptador para exibir os dados. Mas a recomendação é usar CarUiListItemAdapter onde a lib do chassi define o layout para listItems e, portanto, pode ser personalizada por OEMs. A customização para ListItems é definida em CarUiListItem .

Por padrão, car_ui_scrollbar_margin é usado como a largura da visualização da barra de rolagem. Essa margem também é adicionada como android:endMargin do CarUiRecyclerView para que haja margem igual no início e no final dos dados. Se o desenvolvedor tiver usado enableDivider=true , o OEM poderá controlar como os divisores devem aparecer. As dimensões que podem ser ajustadas para CarUiRecyclerView são:

  <dimen name="car_ui_recyclerview_divider_height">0dp</dimen>
  <dimen name="car_ui_recyclerview_divider_start_margin">0dp</dimen>
  <dimen name="car_ui_recyclerview_divider_end_margin">0dp</dimen>
  <dimen name="car_ui_recyclerview_divider_top_margin">0dp</dimen>
  <dimen name="car_ui_recyclerview_divider_bottom_margin">0dp</dimen>

Barra de rolagem

O arquivo de layout da barra de rolagem CarUiRV é definido em car_ui_recyclerview_scrollbar.xml . No total, essas quatro visualizações são definidas dentro da visualização:

Visualizações
Car_ui_scrollbar_page_up Define o botão para cima da barra de rolagem.
Car_ui_scrollbar_page_down define o botão para baixo da barra de rolagem.
Car_ui_scrollbar_thumb A altura é calculada dinamicamente dependendo do número de itens da lista na Exibição do Reciclador (RV).
Car_ui_scrollbar_track Altura total que define os limites nos quais o polegar se moverá.

Os OEMs devem sobrepor esse arquivo de layout para personalizar a barra de rolagem. A visualização da trilha deve ser colocada com cuidado, pois isso definiria os limites nos quais o polegar se moverá. A altura do polegar será calculada dinamicamente com base nos itens da lista no RV e na altura dos visualizadores.

Este layout é incluído no contêiner CarUiRV car_ui_recycler_view.xml somente se car_ui_scrollbar_enable for true .

Outras dimensões que podem ser ajustadas para a barra de rolagem são:

  <dimen name="car_ui_scrollbar_container_width">@dimen/car_ui_margin</dimen>
  <dimen name="car_ui_scrollbar_button_size">@dimen/car_ui_touch_target_width</dimen>
  <dimen name="car_ui_scrollbar_thumb_width">7dp</dimen>
  <dimen name="car_ui_scrollbar_separator_margin">16dp</dimen>
  <dimen name="car_ui_scrollbar_margin">@dimen/car_ui_margin</dimen>
  <dimen name="car_ui_scrollbar_thumb_radius">100dp</dimen>

  <item name="car_ui_button_disabled_alpha" format="float" type="dimen">0.2</item>
  <item name="car_ui_scrollbar_milliseconds_per_inch" format="float" type="dimen">150.0</item>
  <item name="car_ui_scrollbar_deceleration_times_divisor" format="float" type="dimen">0.45</item>
  <item name="car_ui_scrollbar_decelerate_interpolator_factor" format="float" type="dimen">1.8</item>

  <dimen name="car_ui_scrollbar_padding_start">0dp</dimen>
  <dimen name="car_ui_scrollbar_padding_end">0dp</dimen>

Exemplo

Por exemplo, para reunir as setas para cima e para baixo na parte inferior da tela:

  1. Sobreposição car_ui_recyclerview_scrollbar.xml :
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="@dimen/car_ui_margin"
        android:layout_height="match_parent"
        android:id="@+id/car_ui_scroll_bar">
    
        <!-- View height is dynamically calculated during layout. -->
        <View
            android:id="@+id/car_ui_scrollbar_thumb"
            android:layout_width="7dp"
            android:layout_height="20dp"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:background="@drawable/car_ui_recyclerview_scrollbar_thumb"/>
    
        <View
            android:id="@+id/car_ui_scrollbar_track"
            android:layout_width="10dp"
            android:layout_height="match_parent"
            android:layout_marginTop="10dp"
            android:layout_centerHorizontal="true"
            android:layout_above="@+id/car_ui_scrollbar_page_up"/>
    
        <ImageView
            android:id="@+id/car_ui_scrollbar_page_up"
            android:layout_width="76dp"
            android:layout_height="76dp"
            android:focusable="false"
            android:hapticFeedbackEnabled="false"
            android:src="@drawable/car_ui_recyclerview_ic_up"
            android:scaleType="centerInside"
            android:layout_centerHorizontal="true"
            android:layout_above="@+id/car_ui_scrollbar_page_down"/>
    
        <ImageView
            android:id="@+id/car_ui_scrollbar_page_down"
            android:layout_width="76dp"
            android:layout_height="76dp"
            android:focusable="false"
            android:hapticFeedbackEnabled="false"
            android:src="@drawable/car_ui_recyclerview_ic_down"
            android:scaleType="centerInside"
            android:layout_centerHorizontal="true"
          android:layout_alignParentBottom="true"/>
    </RelativeLayout>
    
  2. Para definir os recursos a serem sobrepostos pelo RRO, adicione Overlays.xml :
    <overlay>
        <item target="id/car_ui_scroll_bar" value="@id/car_ui_scroll_bar"/>
        <item target="id/car_ui_scrollbar_thumb" value="@id/car_ui_scrollbar_thumb"/>
        <item target="id/car_ui_scrollbar_track" value="@id/car_ui_scrollbar_track"/>
        <item target="id/car_ui_scrollbar_page_up" value="@id/car_ui_scrollbar_page_up"/>
        <item target="id/car_ui_scrollbar_page_down" value="@id/car_ui_scrollbar_page_down"/>
        <item target="layout/car_ui_recyclerview_scrollbar" value="@layout/car_ui_recyclerview_scrollbar"/>
    </overlay>
    
  3. Se um drawable para cima, para baixo ou polegar precisar ser atualizado, eles também deverão ser sobrepostos.
  4. Se algum recurso novo for usado no pacote RRO que ainda não existe, esses recursos também deverão ser definidos no APK RRO que você criar.