Android数据绑定和animation

在使用数据绑定时,有人可以指导我如何触发animation?

我有一个图标,根据我的viewmodel中的数据而改变。 当视图模型发生变化时(即视图模型中的属性发生变化),如何为图标更改设置animation?

Solutions Collecting From Web of "Android数据绑定和animation"

一个可能的解决scheme是使用绑定适配器。 以下是一个快速示例,告诉您要走的路:

首先我们定义一个定制绑定适配器:

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; } } 

示例布局将如下所示:

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

正如你所看到的,你的viemodel的'isBusy'属性绑定到视图(imagebutton)。 你可以在任何视图中使用这个适配器,而不仅仅是一个图像button。

当然,'isBusy'属性必须是可绑定的(例如,您的视图模型扩展了BaseObservable,或者至less它是一个ObservableBoolean)。

所以无论何时将“isBusy”属性更改为true,都会触发animation开始。 将其设置为false,停止。

希望这可以帮助 ?