2016-01-18 16 views

risposta

15

Tecnicamente è solo uno Spinner con visualizzazioni personalizzate e stili.

Ho provato a creare uno che assomigli a quello che hai postato, usando AppCompat, lavorando con i drawable personalizzati e con la proprietà di elevazione della vista, quindi potrebbe non funzionare completamente per le versioni Android precedenti alla 5.0.

Prima definiamo il nostro Spinner con le sue proprietà discesa:

<your.package.CustomSpinner 
    android:id="@+id/spinner" 
    style="@style/Widget.AppCompat.Spinner" 
    android:layout_margin="10dp" 
    android:layout_width="200dp" 
    android:dropDownWidth="200dp" 
    android:layout_height="?attr/dropdownListPreferredItemHeight" 
    android:dropDownVerticalOffset="?attr/dropdownListPreferredItemHeight" 
    android:background="@drawable/spinner_bg" 
    android:popupBackground="@android:color/white" 
    android:paddingRight="14dp" 
    android:stateListAnimator="@drawable/spinner_sla" 
    android:popupElevation="3dp" /> 

Importante: Usiamo il CustomSpinner class from this post, perché abbiamo bisogno i callback di sapere quando il filatore apre un chiude (per scopi di stile).

Quindi impostiamo lo spinner: Utilizziamo una vista personalizzata per l'elemento selezionato (layout definito di seguito) per applicare i nostri stili e il valore predefinito di AppCompat R.layout.support_simple_spinner_dropdown_item, ma potremmo usare un altro layout per regolare ulteriormente lo stile.

String[] data = {"Arial", "Calibri", "Helvetica", "Roboto", "Veranda"}; 

ArrayAdapter adapter = new ArrayAdapter<>(getContext(), R.layout.spinner_item_selected, data); 
adapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item); 

final CustomSpinner spinner = (CustomSpinner) view.findViewById(R.id.spinner); 
spinner.setAdapter(adapter); 
spinner.setSpinnerEventsListener(new CustomSpinner.OnSpinnerEventsListener() { 
    public void onSpinnerOpened() { 
     spinner.setSelected(true); 
    } 
    public void onSpinnerClosed() { 
     spinner.setSelected(false); 
    } 
}); 

E qui il spinner_item_selected.xml di layout:

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    style="?attr/spinnerDropDownItemStyle" 
    android:singleLine="true" 
    android:layout_width="match_parent" 
    android:layout_height="?attr/dropdownListPreferredItemHeight" 
    android:background="@drawable/abc_spinner_mtrl_am_alpha" 
    android:ellipsize="marquee" /> 

Inoltre abbiamo bisogno dei drawable utilizzati in precedenza:

spinner_bg.xml come sfondo della trottola:

<selector xmlns:android="http://schemas.android.com/apk/res/android" 
    android:exitFadeDuration="@android:integer/config_mediumAnimTime"> 
    <item android:state_pressed="true" android:drawable="@android:color/white" /> 
    <item android:state_selected="true" android:drawable="@android:color/white" /> 
    <item> 
     <inset android:insetLeft="-1dp" android:insetRight="-1dp"> 
      <shape android:shape="rectangle"> 
       <stroke android:width="1dp" android:color="#cccccc" /> 
       <solid android:color="#f0f0f0" /> 
      </shape> 
     </inset> 
    </item> 
</selector> 

spinner_sla.xml per animare il filatore del elevazione:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true"> 
     <set> 
      <objectAnimator 
       android:duration="@android:integer/config_mediumAnimTime" 
       android:propertyName="translationZ" 
       android:valueTo="3dp" /> 
     </set> 
    </item> 
    <item android:state_selected="true"> 
     <set> 
      <objectAnimator 
       android:duration="@android:integer/config_shortAnimTime" 
       android:propertyName="translationZ" 
       android:valueTo="3dp" /> 
     </set> 
    </item> 
    <item> 
     <set> 
      <objectAnimator 
       android:duration="@android:integer/config_shortAnimTime" 
       android:propertyName="translationZ" 
       android:valueTo="0" /> 
     </set> 
    </item> 
</selector> 

Questo ci dà un risultato come questo (a sinistra crollato, destra aperta):

enter image description here

Se vogliamo usare un filatore con le immagini, ci sarebbe anche necessario definire un menu a discesa personalizzato vista articolo.

Problemi correlati