通过场景转换动画在android中设置色彩动画

时间:2016-01-27 17:19:49

标签: android animation material-design

所以在我的应用程序中,我在图像视图上有一个场景转换,将它从一个活动转换到另一个活动:

v.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent i = new Intent(v.getContext(),tracks.class);
                        i.putExtra("album", al);
                        ActivityOptions transitionActivityOptions = ActivityOptions.makeSceneTransitionAnimation((item_display) v.getContext(), cover, "pic");
                        v.getContext().startActivity(i, transitionActivityOptions.toBundle());
                    }
                });

现在,缩放和定位过渡工作正常。但是,在第二个活动的imageview中,我在xml中有一个tint属性,使其更暗(样式选择)。色调没有动画,所以整个效果比我想要的更刺耳。有没有办法让色调像图像的其余部分一样来回平滑过渡?

1 个答案:

答案 0 :(得分:1)

使用custom transition。这样的事情。

public class TintTransition extends Transition {

private static final String PROPNAME_TINT = "com.example:TintTransition:tint";

public TintTransition(Context context, AttributeSet attrs) {
    super(context, attrs);
}

private void captureValues(TransitionValues values) {

    if (values.view instanceof AppCompatImageView) {
        values.values.put(PROPNAME_TINT, ((AppCompatImageView) values.view).getImageTintList());
    }

}

@Override
public void captureStartValues(TransitionValues transitionValues) {
    captureValues(transitionValues);
}

@Override
public void captureEndValues(TransitionValues transitionValues) {
    captureValues(transitionValues);
}


@Override
public Animator createAnimator(ViewGroup sceneRoot, final TransitionValues startValues, final TransitionValues endValues) {


    if (endValues == null) {
        return null;
    }

    if (!(endValues.view instanceof AppCompatImageView)) {
        return null;
    }


    ColorStateList startColorStateList = (ColorStateList) startValues.values.get(PROPNAME_TINT);
    ColorStateList endColorStateList = (ColorStateList) endValues.values.get(PROPNAME_TINT);

    final int endColor = endColorStateList.getDefaultColor();
    final int startColor = startColorStateList == null
            ? Color.TRANSPARENT
            : startColorStateList.getDefaultColor();

    ValueAnimator animator = ValueAnimator.ofObject(new ArgbEvaluator(), startColor, endColor);

    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            Integer color = (Integer) animation.getAnimatedValue();
            if (color != null) {
                ((AppCompatImageView) endValues.view).setImageTintList(ColorStateList.valueOf(color));

            }
        }
    });


    return animator;

}

}

如果您需要从XML进行扩充,可以采用以下方法:

<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
    <transition class="com.example.transitions.TintTransition" android:duration="400" android:interpolator="@android:interpolator/fast_out_slow_in"/>
</transitionSet>