带共享元素的片段到片段动画无法按预期工作

时间:2018-11-06 20:25:09

标签: androidx fragment-transitions

from matplotlib import pyplot as plt import numpy as np import mpl_toolkits.mplot3d.axes3d as p3 from matplotlib import animation import mpl_toolkits.mplot3d.art3d as art3d %config InlineBackend.figure_format = 'svg' %matplotlib notebook import ipywidgets as widgets from ipywidgets import HBox, VBox, interact, interactive, fixed, interact_manual from IPython.display import display play = widgets.Play( interval=10, value= 0, min=0, max=100, step=1, description="Press play", disabled=False ) slider = widgets.IntSlider() widgets.jslink((play, 'value'), (slider, 'value')) widgets.HBox([play, slider]) display(play, slider) fig = plt.figure() ax = p3.Axes3D(fig) x = np.linspace(-1,1,100) y = np.linspace(-1,1,100) ax.plot(x, y, x*y * slider.value, lw = '2') plt.show() 中有AppCompatActivity的片段(RecyclerView)中,myFragment1依此类推,因此,如果我单击某个项目,则{{1} }将显示并显示项目的详细信息。在此阶段,我想在两个具有共享元素的片段之间创建动画。
重现该行为的步骤:

viewholders

在(a)代码中,图像过渡是正确的,并且动画在共享元素之间完美地发生,但是我不需要这样做。 在(b)代码中,唯一的区别是myFragment2被隐藏并添加了import android.view.View; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; [...] public class AppActivity extends AppCompatActivity myFragment1.setSharedElementReturnTransition(new MyNewTransition()); myFragment1.setSharedElementEnterTransition(new MyNewTransition()); [...] a) getSupportFragmentManager().beginTransaction() .addSharedElement(myImage, "mytransition") .replace(R.id.recycler_view_container, myFragment2) .commit(); b) getSupportFragmentManager().beginTransaction() .addSharedElement(myImage, "mytransition") .add(R.id.recycler_view_container, myFragment2) .hide(myFragment1) commit(); ,在这种情况下,enter过渡和return过渡都被破坏了,并且没有动画发生。
我需要(b)代码,因为“替换”-片段将破坏myFragment1,而重建它是一个繁重的过程。 我认为这是androidx库的错误

编辑: 我基于Bryan Herbst的演示构建了一个示例:
FragmentTransitionSample,并重新适应了androidx,here是源。

1 个答案:

答案 0 :(得分:0)

尝试添加setReorderingAllowed(true)

例如:

getSupportFragmentManager().beginTransaction() 
                .setReorderingAllowed(true)
                .addSharedElement(myImage, "mytransition") 
                .add(R.id.recycler_view_container, myFragment2) 
                .hide(myFragment1)  
                 commit();