TL; DR:我正在寻找一个完整的工作样本,我将其称为"Gmail三片段动画"场景.具体来说,我们想从两个片段开始,如下所示:

在一些UI事件(例如,点击片段B中的某些内容)时,我们希望:
并且,在按下BACK按钮时,我们希望反转这组操作.
现在,我已经看到了很多部分实现; 我将在下面回顾其中的四个.除了不完整之外,他们都有自己的问题.
@Reto迈尔促成这种普遍的回答相同的基本问题,表明你会使用setCustomAnimations()一个FragmentTransaction.对于双片段场景(例如,您最初只看到片段A,并希望使用动画效果将其替换为新的片段B),我完全同意.然而:
<objectAnimator>他的代码示例使用像素的硬连线的位置,这似乎是不切实际给出不同的屏幕尺寸,但setCustomAnimations()需要动画资源,排除在Java中定义这些事情的可能性android:layout_weight在LinearLayout为按百分比分配空间GONE?android:layout_weight的0?预动画为0?别的一个规模?)@Roman Nurik指出,您可以动画任何属性,包括您自己定义的属性.这可以帮助解决硬连线位置的问题,代价是发明自己的自定义布局管理器子类.这有些帮助,但我仍然对Reto的其余解决方案感到困惑.
这个pastebin条目的作者显示了一些诱人的伪代码,基本上说所有三个片段最初都会驻留在容器中,片段C通过hide()事务操作在开始时隐藏.当UI事件发生时,我们接着是show()C和hide()A. 但是,我没有看到它如何处理B改变大小的事实.它还依赖于你显然可以在同一个容器中添加多个片段的事实,我不确定这是否是长期可靠的行为(更不用说它应该打破findFragmentById(),尽管我可以忍受它).
此博客文章的作者表示Gmail根本不使用setCustomAnimations(),而是直接使用对象动画师("您只需更改根视图的左边距+更改右视图的宽度").然而,这仍然是一个双片段解决方案AFAICT,并且再次显示的实现硬连线尺寸以像素为单位.
我将继续关注此问题,所以有一天我可能会自己回答这个问题,但我真的希望有人为这个动画场景制定了三片段解决方案,并且可以发布代码(或链接).Android中的动画让我想要脱掉头发,而那些见过我的人知道这是一个毫无结果的努力.
我试图建立Android新的收件箱样式列表视图左右滑动,如图所示,我尝试了47deg swipelistview但它不稳定,有没有其他库可用?!
到目前为止尝试了47度
 public class MainActivity extends Activity {
        Listview pullToRefreshListView;
        SwipeListView swipelistview;
        ItemAdapter adapter;
        List<ItemRow> itemData;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            pullToRefreshListView = (ListView) findViewById(R.id.example_swipe_lv_list);
            swipelistview = pullToRefreshListView.getRefreshableView();
            itemData = new ArrayList<ItemRow>();
            adapter = new ItemAdapter(this, R.layout.custom_row, itemData);
            swipelistview.setSwipeListViewListener(new BaseSwipeListViewListener() {
                @Override
                public void onOpened(int position, boolean toRight) {
                    if (toRight) {
                        adapter.remove(position);
                        Toast.makeText(MainActivity.this, "Open to dismiss",
                                Toast.LENGTH_SHORT).show();
                    } // swipelistview.dismiss(position);
                    else {
                        Toast.makeText(MainActivity.this, "Open to edit",
                                Toast.LENGTH_SHORT).show();
                    }
                }
                @Override
                public void onClosed(int …