2015-12-28 16 views
8

Czy ktoś może wskazać mi, w jaki sposób wywołać animację podczas korzystania z wiązania z danymi?Android databinding i animacja

Mam ikonę, która zmienia się zgodnie z danymi w moim viewmodel. Jak animować zmianę ikony, gdy zmienia się viewmodel (to znaczy, gdy właściwość zmienia się w viewmodelu)?

+0

Chcesz wywołać animację, jeśli właściwość zmieni się w twoim viemodelu? Czy to oznacza "kiedy zmienia się model widoku"? –

+0

tak, właśnie to mam na myśli. –

+0

Dodano odpowiedź z przykładem. –

Odpowiedz

15

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?

+0

Dziękuję. Myślę, że to jest dokładnie to, czego potrzebowałem. wypróbuje to –

+0

To jest zajebiste! – sirvon

+0

Jak połączyć ViewBusyBindings' z modelem widoku? – tir38