Teraz, gdy pojawił się Android 5.0, zastanawiałem się, jak zaimplementować animowane ikony paska akcji.
Ta biblioteka tutaj implementuje ją dobrze, ale skoro biblioteka appcompat v7 ma ją, jak można ją zaimplementować?
Biblioteka odwołuje się do niego w plikach themes.xml
<item name="drawerArrowStyle">@style/Widget.AppCompat.DrawerArrowToggle</item>
W tym stylu
<style name="Base.V7.Theme.AppCompat" parent="Platform.AppCompat">
AKTUALIZACJA
Zaimplementowałem to za pomocą DrawerToggle w wersji 7. Jednak nie mogę tego stylizować. Proszę pomóż
Znalazłem jego styl w pliku v7 styles_base.xml
<style name="Base.Widget.AppCompat.DrawerArrowToggle" parent="">
<item name="color">?android:attr/textColorSecondary</item>
<item name="thickness">2dp</item>
<item name="barSize">18dp</item>
<item name="gapBetweenBars">3dp</item>
<item name="topBottomBarArrowSize">11.31dp</item>
<item name="middleBarArrowSize">16dp</item>
<item name="drawableSize">24dp</item>
<item name="spinBars">true</item>
</style>
Dodałem to do moich stylów i nie działało. Dodano również do mojego attr.xml
<declare-styleable name="DrawerArrowToggle">
<!-- The drawing color for the bars -->
<attr name="color" format="color"/>
<!-- Whether bars should rotate or not during transition -->
<attr name="spinBars" format="boolean"/>
<!-- The total size of the drawable -->
<attr name="drawableSize" format="dimension"/>
<!-- The max gap between the bars when they are parallel to each other -->
<attr name="gapBetweenBars" format="dimension"/>
<!-- The size of the top and bottom bars when they merge to the middle bar to form an arrow -->
<attr name="topBottomBarArrowSize" format="dimension"/>
<!-- The size of the middle bar when top and bottom bars merge into middle bar to form an arrow -->
<attr name="middleBarArrowSize" format="dimension"/>
<!-- The size of the bars when they are parallel to each other -->
<attr name="barSize" format="dimension"/>
<!-- The thickness (stroke size) for the bar paint -->
<attr name="thickness" format="dimension"/>
</declare-styleable>
Ale zawiesza się i wyświetla błąd typu koloru, gdy to robi. Czego mi brakuje?
mDrawerToggle.syncState();
naprawiło to.Cannot resolve method setSupportActionBar(android.widget.Toolbar)
. Próbowałem też zandroid.support.v7.toolbar
. Czy ktoś wie, dlaczego tak się dzieje?setSupportActionBar(mToolbar);
i zdefiniowałem,<item name="spinBars">true</item>
ale animacja nie działaJeśli korzystasz z biblioteki pomocy technicznej DrawerLayout, zgodnie z sugestią zawartą w szkoleniu dotyczącym tworzenia szuflady nawigacji , możesz skorzystać z nowo dodanej obsługi android.support. v7 .app.ActionBarDrawerToggle (uwaga: inna niż obecnie przestarzała android.support. v4 .app.ActionBarDrawerToggle ):
Chociaż szkolenie nie zostało zaktualizowane w celu uwzględnienia przestarzałej / nowej klasy, powinieneś być w stanie używać go prawie dokładnie tego samego kodu - jedyną różnicą w jego implementacji jest konstruktor.
źródło
ActionBarDrawerToggle
. Odpowiedź kanoniczną od producenta AppCompat posiada pełną przykład w jaki sposób powinna być skonstruowana XML.Stworzyłem małą aplikację, która miała podobną funkcjonalność
Główna aktywność
Mój kod XML tego działania
Mój niestandardowy pasek narzędzi XML
Mój styl motywu
Moje style w values-v21
źródło
Aby odpowiedzieć na zaktualizowaną część pytania: aby nadać styl ikonie / strzałce szuflady, masz dwie możliwości:
Stylizuj samą strzałkę
Aby to zrobić, nadpisz
drawerArrowStyle
w swoim motywie w następujący sposób:To prawdopodobnie nie jest to, czego chcesz , ponieważ sam ActionBar powinien mieć spójną stylizację ze strzałką, więc najprawdopodobniej chcesz wybrać opcję drugą:
Motyw dla ActionBar / Toolbar
Zastąp atrybut
android:actionBarTheme
(actionBarTheme
dla appcompat) globalnego motywu aplikacji własnym motywem (z którego prawdopodobnie powinieneś pochodzićThemeOverlay.Material.ActionBar/ThemeOverlay.AppCompat.ActionBar
) w następujący sposób:Ważną uwagą jest to, że gdy używasz niestandardowego układu z
Toolbar
implementacją ActionBar zamiast standardowej (np. Jeśli używasz kombinacjiDrawerLayout
-NavigationView
- wToolbar
celu uzyskania efektu szuflady w stylu materiału, gdzie jest widoczny pod półprzezroczystymactionBarTheme
paskiem stanu), atrybut oczywiście nie jest pobierane automatycznie (ponieważAppCompatActivity
domyślnie ma się tym zająćActionBar
), więcToolbar
nie zapomnij zastosować motywu ręcznie:- rozwiąże to do wartości domyślnej AppCompat
ThemeOverlay.AppCompat.ActionBar
lub do nadpisania, jeśli ustawisz atrybut w wyprowadzonym motywie.PS mały komentarz na temat
drawerArrowStyle
przesłonięcia ispinBars
atrybutu - który, jak sugeruje wiele źródeł, powinien być ustawiony,true
aby uzyskać animację szuflady / strzałki. Chodzi o to,spinBars
żetrue
domyślnie w AppCompat (sprawdźBase.Widget.AppCompat.DrawerArrowToggle.Common
styl), nie musiszactionBarTheme
w ogóle nadpisywać, aby animacja działała. Otrzymasz animację, nawet jeśli ją przesłonisz i ustawisz atrybut nafalse
, to po prostu inna, mniej kręta animacja. Ważną rzeczą jest użycieActionBarDrawerToggle
, to przyciąga fantazyjne animowane rysowanie.źródło
Chcę trochę poprawić powyższy kod
a wszystkie inne rzeczy pozostaną takie same ...
Dla tych, którzy mają problem z
Drawerlayout
nakładaniem paska narzędzidodaj
android:layout_marginTop="?attr/actionBarSize"
do głównego układu zawartości szufladyźródło
getSupportActionBar()
gdy po prostu przedłużaszActivity
?ActionBarActivity