Jednym z możliwych rozwiązań jest użycie adaptera wiążącego. Oto krótka próbka pokazać wam drogę do przebycia:
Najpierw musimy zdefiniować niestandardowy wiążącej adaptera:
import android.databinding.BindingAdapter;
import android.support.v4.view.animation.FastOutSlowInInterpolator;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Interpolator;
import android.view.animation.RotateAnimation;
import android.view.animation.TranslateAnimation;
public class ViewBusyBindings {
private static final Interpolator INTERPOLATOR = new FastOutSlowInInterpolator();
@BindingAdapter("isBusy")
public static void setIsBusy(View view, boolean isBusy) {
Animation animation = view.getAnimation();
if (isBusy && animation == null) {
view.startAnimation(getAnimation());
} else if (animation != null) {
animation.cancel();
view.setAnimation(null);
}
}
private static Animation getAnimation() {
RotateAnimation anim = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
anim.setInterpolator(INTERPOLATOR);
anim.setDuration(1400);
anim.setRepeatCount(TranslateAnimation.INFINITE);
anim.setRepeatMode(TranslateAnimation.RESTART);
return anim;
}
}
Układ przykładem będzie wyglądać następująco:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="vm"
type="de.example.exampleviewmodel"/>
</data>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<ImageButton
android:id="@+id/btnPlay"
style="?attr/borderlessButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|bottom"
android:src="@drawable/ic_play_circle_filled_white_36dp"
app:isBusy="@{vm.isBusy}"/>
</FrameLayout>
</layout>
jak można zobacz, właściwość 'isBusy' twojego viemodelu jest związana z widokiem (imagebutton). Możesz używać tego adaptera w dowolnym widoku nie tylko na obrazku.
Oczywiście właściwość 'isBusy' musi być wiążąca (np. Twój viewmodel rozszerza BaseObservable lub jako minimum jest ObservableBoolean).
Gdy zmienisz właściwość "isBusy" na wartość true, uruchomi się animacja. Ustaw na false, zatrzymuje się.
Mam nadzieję, że to pomaga?
Chcesz wywołać animację, jeśli właściwość zmieni się w twoim viemodelu? Czy to oznacza "kiedy zmienia się model widoku"? –
tak, właśnie to mam na myśli. –
Dodano odpowiedź z przykładem. –