Android - 具有多个共享元素的不同转换

时间:2016-11-17 08:38:21

标签: android textview android-5.0-lollipop android-transitions shared-element-transition

我正在使用Android Lollipop Transitions,我总结了以下问题:

  1. CardView ImageViewTextViewImageView
  2. 当我点击该卡片时,系统会启动一项新活动,其中包含不同位置的TextViewTextView
  3. 如果我不将Transition中的ImageView作为共享元素包含在内,那么ImageView突然消失了Transition,这看起来并不好,很好,很棒
  4. 如果我包含它,它不能很好地缩放文本并突然改变到最终大小(我已经知道this solution,但问题是我想保留默认{{1} } ChangeBounds,它是Transition ChangeImageTransformActivity,...等的组合。)
  5. 那么,任何人都知道在启动新的 public value struct DeviceInfo { Byte DeviceCompatibility; Size imageSize; static initonly DeviceInfo Empty = { (Size::Empty, 0 ) }; }; 时如何为不同的共享视图抛出不同的转换?

    干杯

2 个答案:

答案 0 :(得分:0)

行,

这可以实现扩展Transition类。由于我想要对ImageView和TextView进行不同的动画制作,我只是编写了一个TextTransform子类Transform,类似于ChangeImageTransform子类,它是Android API 21+的一部分。关键是重写了这个方法(显示了查找ImageView个对象的ChangeImageTransform的情况):

@Override
private void captureValues(TransitionValues transitionValues) {
    View view = transitionValues.view;
    if (!(view instanceof ImageView) || view.getVisibility() != View.VISIBLE) {
        return;
    }
    (...)
}

然后将所有变换应用于新场景,相关变换将附加到相应的视图:

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
    <fade android:fadingMode="fade_out" />
    <changeBounds />
    <changeImageTransform />
    <com.mypackage.transforms.TextTransform />
    <fade android:fadingMode="fade_in" />
</transitionSet>

然后使用Transition

在新Activity的OnCreate方法上设置此setSharedElementEnterTransition(inflatedTransitionSet);

答案 1 :(得分:0)

您在答案中指出的方式可以用于此目的,但实际上是通过特殊的View仅接受适当的transition类型(例如,仅ImageView ChangeImageTransform

您可以改为使用 addTarget(Class targetType)

final Transition transition = new TransitionSet()
    .addTransition(new ChangeTransform()).addTarget(TextView.class) // Only for TextViews
    .addTransition(new ChangeImageTransform()).addTarget(ImageView.class) // Only for ImageViews
    .addTransition(new ChangeBounds()); // For both

setSharedElementEnterTransition(transition);

这种方式更简单,更合乎逻辑。另外,它还可用于其他一些过滤(transitionName等)。请参阅addTarget()重载类型。