Ich habe überall nach einer geeigneten Lösung für mein Problem gesucht und kann noch keine finden. Ich habe eine ActionBar (ActionBarSherlock) mit einem Menü, das aus einer XML-Datei aufgeblasen wird. Dieses Menü enthält ein Element und dieses Element wird als ActionItem angezeigt.
Speisekarte:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/menu_refresh"
android:icon="@drawable/ic_menu_refresh"
android:showAsAction="ifRoom"
android:title="Refresh"/>
</menu>
Aktivität:
[...]
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.mymenu, menu);
return true;
}
[...]
Das ActionItem wird mit einem Symbol und ohne Text angezeigt. Wenn ein Benutzer jedoch auf das ActionItem klickt, soll das Symbol animiert werden, genauer gesagt, an Ort und Stelle gedreht werden. Das betreffende Symbol ist ein Aktualisierungssymbol.
Mir ist klar, dass ActionBar die Verwendung von benutzerdefinierten Ansichten unterstützt ( Hinzufügen einer Aktionsansicht ). Diese benutzerdefinierte Ansicht wird jedoch erweitert, um den gesamten Bereich der ActionBar abzudecken, und blockiert tatsächlich alles außer dem App-Symbol, das in meinem Fall nicht das ist, wonach ich gesucht habe .
Mein nächster Versuch war also, AnimationDrawable zu verwenden und meine Animation Frame für Frame zu definieren, das Drawable als Symbol für den Menüpunkt festzulegen und dann onOptionsItemSelected(MenuItem item)
das Symbol abzurufen und mit der Animation zu beginnen ((AnimationDrawable)item.getIcon()).start()
. Dies war jedoch erfolglos. Kennt jemand einen Weg, um diesen Effekt zu erzielen?
android:paddingLeft="12dp"
undandroid:paddingRight="12dp"
zu meinem eigenen Thema hinzugefügt habe.Ich habe ein bisschen an der Lösung mit ActionBarSherlock gearbeitet und mir Folgendes ausgedacht:
res / layout / indeterminate_progress_action.xml
res / layout-v11 / indeterminate_progress_action.xml
res / drawable / rotation_refresh.xml
Code in Aktivität (ich habe ihn in der übergeordneten Klasse ActivityWithRefresh)
in Aktivität Erstellen von Menüelementen
Und das Symbol ist das
drawable-xhdpi/ic_menu_navigation_refresh.png
Dies kann unter http://developer.android.com/design/downloads/index.html#action-bar-icon-pack gefunden werden
quelle
Zusätzlich zu den Aussagen von Jake Wharton sollten Sie Folgendes tun, um sicherzustellen, dass die Animation reibungslos stoppt und nicht herumspringt, sobald das Laden beendet ist.
Erstellen Sie zunächst einen neuen Booleschen Wert (für die gesamte Klasse):
Suchen Sie die Methode, mit der das Laden gestartet wird. Setzen Sie Ihren Booleschen Wert auf true, wenn die Aktivität geladen wird.
Suchen Sie die Methode, die gestartet wird, wenn das Laden abgeschlossen ist. Anstatt die Animation zu löschen, setzen Sie Ihren Booleschen Wert auf false.
Legen Sie einen AnimationListener für Ihre Animation fest:
Jedes Mal, wenn die Animation einmal ausgeführt wurde, dh wenn Ihr Symbol eine Umdrehung ausgeführt hat, überprüfen Sie den Ladezustand. Wenn die Animation nicht mehr geladen wird, wird sie gestoppt.
Auf diese Weise kann die Animation nur gestoppt werden, wenn sie sich bereits bis zum Ende gedreht hat und in Kürze wiederholt wird UND nicht mehr geladen wird.
Dies ist zumindest das, was ich getan habe, als ich Jakes Idee umsetzen wollte.
quelle
Es gibt auch eine Option zum Erstellen der Rotation im Code. Voller Snip:
quelle
Mit der Support-Bibliothek können wir Symbole ohne benutzerdefinierte actionView animieren.
Wir können Drawable nicht direkt animieren. Verwenden Sie daher DrawableWrapper (von android.support.v7 für API <21):
Ich habe die Idee für DrawableWrapper von hier übernommen: https://stackoverflow.com/a/39108111/5541688
quelle
Es ist meine sehr einfache Lösung (zum Beispiel, brauche einen Refactor) funktioniert mit Standard MenuItem, du kannst es mit einer beliebigen Anzahl von Zuständen, Symbolen, Animationen, Logik usw. verwenden.
in der Aktivitätsklasse:
Standard Hörer:
in refreshData () mache so etwas:
Methode zum Definieren von Farbe oder Animation für Symbol:
Es gibt 2 Layouts mit Symbol (R.layout.refresh_action_view (+ "_actual")):
Standard-Rotationsanimation in diesem Fall (R.anim.rotation):
quelle
Der beste Weg ist hier:
und dann:
Denken Sie daran, dass Sie nicht auf "btsync = this.findViewById (R.id.action_sync)" zugreifen können. at onCreate () oder onStart () oder onResume () oder onPostResume () oder onPostCreate () oder onCreateOptionsMenu () oder onPrepareOptionsMenu ()
quelle