android - 为什么淡入淡出过渡不适用于共享元素

标签 android android-transitions shared-element-transition

我有 2 个 Activity ,共享元素转换工作正常。ChangeBounds 是唯一应用的转换。

我想在共享元素移动时应用淡入淡出过渡,因此顺序为 ORDERING_TOGETHER。

public class TransitionUtils {

    public static Transition makeSharedElementEnterTransition(final Context context, final long duration) {
        TransitionSet set = new TransitionSet();
        set.setOrdering(TransitionSet.ORDERING_TOGETHER);
        set.setDuration(duration);

        Transition changeBounds = new ChangeBounds();
        changeBounds.addTarget(context.getString(R.string.transition_name_search_text));
        set.addTransition(changeBounds);

        Transition fade = new Fade(Fade.OUT);
        fade.addTarget(context.getString(R.string.transition_name_search_text));
        set.addTransition(fade);

        return set;
    }

}

startActivity 调用ActivityOptions.makeSceneTransitionAnimation

在 EndActivity 中,设置了进入共享元素转换

public class EndActivity extends Activity{
    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.blabla);
        getWindow().setSharedElementEnterTransition(TransitionUtils.makeSharedElementEnterTransition(this,2000));
    }
}

备注:我注意到了

  • Fade() 通常应用于 getWindow().setEnterTransition()
  • 设置一个 TransitionSet 的持续时间适用于包含的所有 Transitions 除了 Fade。

如何将 Fade Transition 应用到 sharedElement ? 我做错了什么?

最佳答案

android.transition.Fade 使用 TransitionAlpha ,在我的 IDE 中无法解析。 android.transition.Fade 用于 Activity 之间的进入和退出过渡。

所以我创建了自己的 Fade 来使用 Alpha。 Android View 的不透明度由 alpha 设置。共享元素使用 View 。

你可以这样调用它:

Transition fadeOut = new FadeTransition(1f, 0f, new LinearInterpolator());
fadeOut.addTarget(transitionName);

完整代码在这里

@TargetApi(21)
public class FadeTransition extends Transition {

    private static final String PROPNAME_BACKGROUND = "android:faderay:background";
    private static final String PROPNAME_TEXT_COLOR = "android:faderay:textColor";
    private static final String PROPNAME_ALPHA = "android:faderay:alpha";

    private float startAlpha;
    private float endAlpha;
    private TimeInterpolator timeInterpolator;

    public FadeTransition(final float startAlpha, final float endAlpha, final TimeInterpolator timeInterpolator) {
        this.startAlpha = startAlpha;
        this.endAlpha = endAlpha;
        this.timeInterpolator = timeInterpolator;
    }

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

    private void captureValues(final TransitionValues transitionValues) {
        transitionValues.values.put(PROPNAME_BACKGROUND, transitionValues.view.getBackground());
        transitionValues.values.put(PROPNAME_ALPHA, transitionValues.view.getAlpha());
        if (transitionValues.view instanceof TextView) {
            transitionValues.values.put(PROPNAME_TEXT_COLOR, ((TextView) transitionValues.view).getCurrentTextColor());
        }
    }

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

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

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

        TextView textView = (TextView) endValues.view;

        if (startAlpha != endAlpha) {
            textView.setAlpha(endAlpha);
        }

        ObjectAnimator fade = ObjectAnimator.ofFloat(textView, View.ALPHA, startAlpha, endAlpha);
        fade.setInterpolator(timeInterpolator);
        return fade;
    }
}

关于android - 为什么淡入淡出过渡不适用于共享元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38748658/

相关文章:

android - 具有不同上下文的共享偏好

android - 了解 Activity 返回转换

android - 是否有适用于 Android 的 Hero iOS 版本?

android - 为什么只有被调用的activity的共享元素进入transition run?

android - 共享元素返回过渡闪烁

java - UTF-8 的字符串构造函数是否已损坏?

android - Activity 不在 android 后台运行

android - JobService 不需要 android.permission.BIND_JOB_SERVICE 权限

android - 返回 Activity 之间的共享元素转换