从转换中排除 ViewGroup(除了一个特定的子级)

san*_*alu 2 animation android android-animation android-transitions shared-element-transition

我试图从共享元素返回转换中排除一个视图组,比如说回收器视图。但问题是我不希望回收器视图的所有子级都排除在外,我希望特定的回收器视图子级包含转换。

Slide transition = new Slide(Gravity.END); 
transition.excludeTarget(recyclerView, true); 
transition.addTarget(ImageView.class); 
setExitTransition(transition); 
setReturnTransition(transition);
Run Code Online (Sandbox Code Playgroud)

我不明白为什么上面的代码不起作用。如果您有任何想法或任何方法来实现这一目标,请告诉我?

azi*_*ian 5

有什么问题?

问题来自于Transition#captureValues()函数if语句:


    void captureValues(ViewGroup sceneRoot, boolean start) {
        clearValues(start);
        if ((mTargetIds.size() > 0 || mTargets.size() > 0)
                && (mTargetNames == null || mTargetNames.isEmpty())
                && (mTargetTypes == null || mTargetTypes.isEmpty())) {
            ...
        } else {
            captureHierarchy(sceneRoot, start);
        }
        ...
    }

第一条语句没有通过,因此该elsecase 被执行,这使得你的语句addTarget(ImageView.class)被忽略。

为什么第一个语句没有通过?

因为addTarget(Class) 会改变 mTargetTypes字段,因此mTargetIdsmTargets都会留空。

相反,执行addTarget(int),这将会改变 mTargetIds

因此,您的转换将如下所示:


    Slide transition = new Slide(Gravity.END); 
    transition.addTarget(R.id.some_imageview); 
    setExitTransition(transition); 
    setReturnTransition(transition);

无需执行transition.excludeTarget(),因为如addTarget()文档中所述:

设置 targetIds 会限制 Transition 仅侦听具有这些 ID 的视图并对其执行操作。具有不同 ID 或没有任何 ID 的视图将被忽略。