将 transitionSet 应用于 Fragment 中的单个 View content transition 会产生重复的视图效果
Apply a transitionSet to a single View in a Fragment content transition produces duplicated view effect
我的目标是在片段之间创建内容转换,其中 Fade() 和 Slide() 仅应用于片段的一个视图。当执行转换(在本例中为 exitTransition)时,视觉效果不是视图同时滑动和淡入淡出,而是视图被复制,一个副本滑动,另一个副本淡出。
一些代码:
Fragment currentFragment = getSupportFragmentManager().getFragments().get(0);
Fragment fragment = EmailSearchFragment.newInstance();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
fragment.setEnterTransition(new Slide(Gravity.RIGHT));
currentFragment.setExitTransition(TransitionInflater.from(this).inflateTransition(R.transition.slide_and_fade));
}
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, fragment)
.addToBackStack(null)
.commit();
这里是过渡:
public class DetailsTransition extends TransitionSet {
public DetailsTransition() {
init();
}
/**
* This constructor allows us to use this transition in XML
*/
public SlideAndFadeTransitionSet(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
setOrdering(ORDERING_TOGETHER);
addTransition(new Fade()).
addTransition(new Slide(Gravity.TOP));
}
}
并且,这里 xml 以单一视图为过渡:
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android" class="com.adidas.connect.app.transition.DetailsTransition">
<targets>
<target android:targetId="@id/social_buttons"/>
</targets>
</transition>
我也尝试过在 XML 中使用过渡集,但我得到了相同的结果,所以我将过渡集移动到新的 class 以确保没有xml 语法针对单一视图的问题。
有人做过这个吗?
提前致谢!
作为解决方法,我创建了自己的 CustomTransitions,其中应用了两种效果:
public class Stack extends Visibility {
public Stack(Context context, AttributeSet attributteSet) {
super(context, attributteSet);
}
@Override
public Animator onDisappear(ViewGroup sceneRoot, View view,
TransitionValues startValues, TransitionValues endValues) {
if (startValues == null) {
return null;
}
Animator slideTop = ObjectAnimator.ofFloat(view, View.TRANSLATION_Y, 0, -sceneRoot.getHeight());
Animator fadeOut = ObjectAnimator.ofFloat(view, View.ALPHA, 1, 0);
AnimatorSet animSet = new AnimatorSet();
animSet.play(slideTop)
.with(fadeOut);
return animSet;
}
@Override
public Animator onAppear(ViewGroup sceneRoot, View view, TransitionValues startValues, TransitionValues endValues) {
...
}
}
现在可以使用了。
我的目标是在片段之间创建内容转换,其中 Fade() 和 Slide() 仅应用于片段的一个视图。当执行转换(在本例中为 exitTransition)时,视觉效果不是视图同时滑动和淡入淡出,而是视图被复制,一个副本滑动,另一个副本淡出。
一些代码:
Fragment currentFragment = getSupportFragmentManager().getFragments().get(0);
Fragment fragment = EmailSearchFragment.newInstance();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
fragment.setEnterTransition(new Slide(Gravity.RIGHT));
currentFragment.setExitTransition(TransitionInflater.from(this).inflateTransition(R.transition.slide_and_fade));
}
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, fragment)
.addToBackStack(null)
.commit();
这里是过渡:
public class DetailsTransition extends TransitionSet {
public DetailsTransition() {
init();
}
/**
* This constructor allows us to use this transition in XML
*/
public SlideAndFadeTransitionSet(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
setOrdering(ORDERING_TOGETHER);
addTransition(new Fade()).
addTransition(new Slide(Gravity.TOP));
}
}
并且,这里 xml 以单一视图为过渡:
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android" class="com.adidas.connect.app.transition.DetailsTransition">
<targets>
<target android:targetId="@id/social_buttons"/>
</targets>
</transition>
我也尝试过在 XML 中使用过渡集,但我得到了相同的结果,所以我将过渡集移动到新的 class 以确保没有xml 语法针对单一视图的问题。
有人做过这个吗?
提前致谢!
作为解决方法,我创建了自己的 CustomTransitions,其中应用了两种效果:
public class Stack extends Visibility {
public Stack(Context context, AttributeSet attributteSet) {
super(context, attributteSet);
}
@Override
public Animator onDisappear(ViewGroup sceneRoot, View view,
TransitionValues startValues, TransitionValues endValues) {
if (startValues == null) {
return null;
}
Animator slideTop = ObjectAnimator.ofFloat(view, View.TRANSLATION_Y, 0, -sceneRoot.getHeight());
Animator fadeOut = ObjectAnimator.ofFloat(view, View.ALPHA, 1, 0);
AnimatorSet animSet = new AnimatorSet();
animSet.play(slideTop)
.with(fadeOut);
return animSet;
}
@Override
public Animator onAppear(ViewGroup sceneRoot, View view, TransitionValues startValues, TransitionValues endValues) {
...
}
}
现在可以使用了。