从转换中排除 ViewGroup,除了一个特定 child

Exclude ViewGroup from transition except one specific child

我正在尝试从共享元素 return 转换中排除一个视图组,比方说回收器视图。但问题是我不希望所有 children 的回收者视图都被排除在外,我希望特定的回收者视图 child 包含转换。

Slide transition = new Slide(Gravity.END); 
transition.excludeTarget(recyclerView, true); 
transition.addTarget(ImageView.class); 
setExitTransition(transition); 
setReturnTransition(transition);

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

有什么问题吗?

问题来自 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);
        }
        ...
    }

第一个语句没有通过,因此执行了 else 案例,这使得您的 addTarget(ImageView.class) 被忽略。

为什么第一个语句不通过?

因为addTarget(Class) will change mTargetTypes字段,所以mTargetIdsmTargets都会留空。

相反,执行 addTarget(int),其中 will change mTargetIds

因此,您的过渡效果如下:


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

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

Setting targetIds constrains the Transition to only listen for, and act on, views with these IDs. Views with different IDs, or no IDs whatsoever, will be ignored.