我在片段上使用新的Lollipop api到setEnterTransition
,然后为片段中的图像添加共享元素转换。首先,图像应移动到其位置,然后片段中的其余视图应淡入。
但是,enterTransition正在应用于共享元素,因此它将与其余视图一起淡入。如果我没有设置enterTransition,那么图像会正常移动,但是当它移动时,其他内容已经可见。
如何让它不将enterTransition应用于共享视图?
我发现this commit in the AOSP似乎应该解决这个问题,但它似乎没有起作用。
以下是示例代码:
public class Fragment1 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.main_fragment, container, false);
final ImageView imageView = (ImageView) rootView.findViewById(R.id.image);
final Button button = (Button) rootView.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TransitionSet transitionSet = new TransitionSet();
transitionSet.addTransition(new ChangeImageTransform());
transitionSet.addTransition(new ChangeBounds());
transitionSet.setDuration(300);
Fragment fragment2 = new Fragment2();
fragment2.setSharedElementEnterTransition(transitionSet);
fragment2.setSharedElementReturnTransition(transitionSet);
Fade fade = new Fade();
fade.setStartDelay(300);
fragment2.setEnterTransition(fade);
getFragmentManager().beginTransaction()
.replace(R.id.container, fragment2)
.addSharedElement(imageView, "SharedImage")
.commit();
}
});
return rootView;
}
}
答案 0 :(得分:24)
输入转换不应该应用共享元素视图。最可能的情况是您的共享元素位于具有背景的另一个视图中,使该视图受到输入转换的影响。这是这样的情况:
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#FFF"
>
<ImageView android:src="@drawable/pretty_picture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:transitionName="picture"
android:padding="20dp"/>
</FrameLayout>
这里,ImageView是共享元素。
如果发生这种情况,您需要添加魔术转换:ChangeTransform。如果它检测到父项发生了变化,它将从父项中提取共享元素并单独转换它。