【问题标题】:Animate a tint in android via scene transition animation通过场景过渡动画在 android 中为色调设置动画
【发布时间】:2016-01-27 17:19:48
【问题描述】:

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

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

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

【问题讨论】:

    标签: android animation material-design


    【解决方案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>
    

    【讨论】:

    • 我无法获取 ImageView。 TransitionValues values.view 给出了mi LinearLayout,也就是整个屏幕。所以我尝试了 values.view.findViewById(R.id.myImageView),这样我就可以找到 ImageView,然后找到 getImageTintList()。不仅这个值是空的,而且它还从 Activity A 而不是从 Activity B 获取 ImageView 的值。不知道如何解决这个问题
    猜你喜欢
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多