【问题标题】:How to animate android fragment in and out of the screen with support library如何使用支持库在屏幕内外设置动画 android 片段
【发布时间】:2014-11-28 00:43:56
【问题描述】:

我试图在我的活动中显示一个片段,其中包含一个菜单,它应该从屏幕右侧滑入,直到用户再次按下按钮或按下后退按钮将其关闭,然后它应该滑动到它来自的地方,当然,这两个动作都有动画。问题是片段滑入,但我不能让它随着动画滑出,它只是弹出消失。我已经阅读了一些类似的帖子,但没有找到适合我的情况的任何有效解决方案。

这是应该完成工作的代码:

private void showMenuFragment() {

    if (this.frMenu == null) {
        this.frMenu = new MenuFragment();               
        FragmentTransaction transaction = this.getSupportFragmentManager()
                .beginTransaction();                    
        transaction.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_right);
        transaction.replace(R.id.fr_side_menu, this.frMenu);
        transaction.addToBackStack(MenuFragment.class.getName());
        transaction.commit();
    }
    else {
        this.frMenu = null;
        this.onBackPressed();
    }       
}

动画:

文件 slide_in_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <translate
        android:duration="500"
        android:fromXDelta="100%"
        android:toXDelta="0%" >
    </translate>

</set>

文件 slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="500"
        android:fromXDelta="0%"
        android:toXDelta="100%" >
    </translate>

</set>

请帮忙!

提前致谢。

【问题讨论】:

  • 如何删除片段?你只是弹出回栈(使用 onBackPressed())吗?
  • 是的,没错。

标签: android animation android-fragments android-animation android-support-library


【解决方案1】:

Android 文档解释,setCustomAnimations(int enter, int exit)

弹出回栈时不会播放这些动画。

因此,您必须使用the longer form,它为popEnterpopExit 提供了额外的参数:

transaction.setCustomAnimations(R.anim.slide_in_right, 
                                R.anim.slide_out_right, 
                                R.anim.slide_in_left, 
                                R.anim.slide_out_left);

为了使这看起来正确,您可能需要定义 slide_in_leftslide_out_left,但这取决于您的目标...

【讨论】:

  • 如果你尝试onBackPressed()而不是getSupportFragmentManager().popBackStack()会发生什么?
  • 我根据您的回答更新了我的代码,但它不能正常工作。当我使用 popBackStack 时也是如此。动画 slide_in_left 是:android:fromXDelta="-100%" 到 android:toXDelta="0" 和 slide_out_left 是 android:fromXDelta="100%" 到 android:fromXDelta="100%"。他们每个人到底应该怎么做?我认为那是我仍然没有得到的。谢谢。
【解决方案2】:

经过一些研究,我发现了一个使用完全不同的方法的非常简单的解决方案,希望它对某人有所帮助。

事物是动画进出布局,其中包含以前在片段内但没有片段的信息。最初,布局可见性设置为“GONE”,并根据用户的操作(如滑动或按下按钮)显示。

这是完整的例子:

1 - 处理用户操作的活动:

public class MainActivity extends Activity {

    private LinearLayout ll;
    private float startX;
    private Animation animLeft;
    private Animation animRight;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ll = (LinearLayout) findViewById(R.id.slider);
        ll.setVisibility(View.GONE);

        animLeft = AnimationUtils.loadAnimation(this, R.anim.anim_left);
        animRight = AnimationUtils.loadAnimation(this, R.anim.anim_right);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN: {
            startX = event.getX();
            break;
        }
        case MotionEvent.ACTION_UP: {
            float endX = event.getX();

            if (endX < startX) {
                System.out.println("Move left");
                ll.setVisibility(View.VISIBLE);
                ll.startAnimation(animLeft);
            } 
            else {
                ll.startAnimation(animRight);
                ll.setVisibility(View.GONE);
            }
        }

        }
        return true;
    }

}

2 - 包含滑动“菜单”的布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/holo_blue_bright" >

    <LinearLayout
        android:id="@+id/slider"
        android:layout_width="100dp"
        android:layout_height="match_parent"
        android:layout_alignParentRight="true"
        android:background="@android:color/darker_gray"
        android:content="@+id/content"
        android:gravity="bottom|center_horizontal"
        android:orientation="vertical" >

        <TextView
            android:id="@id/content"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Surviving with android" />
    </LinearLayout>

</RelativeLayout>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多