2015-12-28 27 views
8

Qualcuno può indicarmi come attivare un'animazione quando si utilizza l'associazione dati?Associazione dati e animazione Android

Ho un'icona che cambia in base ai dati nel mio viewmodel. Come faccio ad animare il cambiamento delle icone quando cambia il modello viewmodel (ovvero quando una proprietà cambia nel viewmodel)?

+0

Si desidera attivare un'animazione se una proprietà viene modificata nella viododel? È questo il significato di "quando cambia il modello di visualizzazione"? –

+0

sì, questo è esattamente quello che intendo. –

+0

Aggiunta risposta con esempio. –

risposta

15

Una possibile soluzione consiste nell'utilizzare un adattatore di rilegatura. Ecco un esempio veloce per mostrarvi la strada da percorrere:

Per prima cosa definire un adattatore personalizzato vincolante:

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; 

    } 
} 

Il layout esempio sarà simile a questa:

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

come si può vedi, la proprietà 'isBusy' della tua viododel è legata alla vista (imagebutton). È possibile utilizzare questo adattatore in qualsiasi vista non solo con un pulsante immagine.

Ovviamente, la proprietà 'isBusy' deve essere associabile (ad es. Viewmodel estende BaseObservable o almeno è ObservableBoolean).

Quindi, ogni volta che si modifica la proprietà 'isBusy' su true, verrà avviata l'animazione. Impostalo su falso, si ferma.

Spero che questo aiuti?

+0

Grazie. Penso che questo sia esattamente ciò di cui avevo bisogno. lo proverò –

+0

È troppo stupido! – sirvon

+0

Come si collega ViewBusyBindings' con il modello di vista? – tir38

Problemi correlati