如何在使用安卓数据绑定(Data Binding)的时候使用动画

泡在网上的日子 / 文 发表于2015-06-02 08:53 次阅读 数据绑定,MVVM

英文原文:Animating Android Binding Transitions 

安卓上新的binding framework可以轻松实现视图根据model的改变而改变。你只需要让model能被观测,然后framework会做好其余的事情。比如,你可以通过下面的代码来实现一个加载提示的显示和隐藏:


<ProgressBar
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:visibility="@{model.loading ? View.VISIBLE : View.GONE}"/>


容易被忽略的是如何让这种改变具有动画效果,比如,要是我们想让progress淡入淡出该咋办?

一种解决办法是使用自定义的@BindingAdapter来应用这种动画。- 参见官方文档对自定义绑定行为的解释。


@BindingAdapter("fadeVisible")
public static void setFadeVisible(final View view, boolean visible) {
    view.animate().cancel();
 
    if (visible) {
        view.setVisibility(View.VISIBLE);
        view.setAlpha(0);
        view.animate().alpha(1).setListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                view.setAlpha(1);
            }
        });
    } else {
        view.animate().alpha(0).setListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                view.setAlpha(1);
                view.setVisibility(View.GONE);
            }
        });
    }
}
<ProgressBar
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    app:fadeVisible="@{model.loading}"/>


但是,这种方式有个问题,每次值发生改变的时候都会产生动画效果,即使是在第一次绑定的时候。比如,你会在旋转屏幕的时候也看到淡入淡出。我们需要一种能判断是否是第一次绑定的办法。

可以利用view的tag不被保持的特点,如果没有tag,则这是第一次绑定,我们设置tag而不运行动画:


@BindingAdapter("fadeVisible")
public static void setFadeVisible(final View view, boolean visible) {
    if (view.getTag() == null) {
        view.setTag(true);
        view.setVisibility(visible ? View.VISIBLE : View.GONE);
    } else {
        view.animate().cancel();
 
        if (visible) {
            view.setVisibility(View.VISIBLE);
            view.setAlpha(0);
            view.animate().alpha(1).setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    view.setAlpha(1);
                }
            });
        } else {
            view.animate().alpha(0).setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    view.setAlpha(1);
                    view.setVisibility(View.GONE);
                }
            });
        }
    }
}


嗯,就是这样,加载提示便会很好的根据model的变化正确的显示淡入淡出了。

收藏 赞 (8) 踩 (0)
上一篇:关于android中的MVVM模式,你须知道的事情
on Android: What You Need to Know
下一篇:Retrofit源码解析
转自: http://frodoking.github.io/2015/05/16/android-retrofit/ 之前花了一段时间整理过一篇文章 OKHttp源码解析 。所以今天打算把一个包装工具Retrofit做一下源码解析。 Retrofit和Java领域的ORM概念类似,ORM把结构化数据转换为Java对象,而Retrofit把R