2016-01-18 30 views

Odpowiedz

15

Technicznie to tylko Spinner z widoków niestandardowych i stylów.

Próbowałem zrobić taki, który wygląda podobnie do tego, który opublikowałeś, używając AppCompat, pracując z niestandardowymi rysunkami iz właściwością elewacji widoku, dlatego może nie działać całkowicie dla wersji Androida starszych niż 5.0.

Najpierw niech nam określić nasze Spinner ze swoich właściwości rozwijanych:

<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" /> 

Ważne: Używamy CustomSpinner class from this post, ponieważ potrzebujemy wywołania zwrotne wiedzieć kiedy spinner otwiera zamyka (dla celów stylizacji).

Następnie konfigurujemy pokrętło: używamy niestandardowego widoku dla wybranego elementu (układ zdefiniowany poniżej), aby zastosować nasze style, oraz domyślnego ustawienia AppCompat R.layout.support_simple_spinner_dropdown_item, ale możemy użyć innego układu, aby jeszcze bardziej dostosować stylizację.

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); 
    } 
}); 

I tu spinner_item_selected.xml układ:

<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" /> 

Dalsze potrzebujemy kanału alfa używane powyżej:

spinner_bg.xml jak turbinki w tle:

<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 animować spinner na wysokość:

<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> 

To daje nam wynik takiego (z lewej zawalił, tuż otwarty):

enter image description here

Jeśli chcemy użyć tarczy z obrazami, to musimy także zdefiniować niestandardową listę rozwijaną widok przedmiotu.