转换android片段向上滑动

use*_*402 26 animation android android-layout android-fragments

我有一个片段来替换另一个片段.我想指定动画.但动画被忽略了.

transaction.replace(R.id.my_fragment, newFrag);
transaction.addToBackStack(null);
transaction.setCustomAnimations(R.anim.slide_in_up, R.anim.slide_out_up);
Run Code Online (Sandbox Code Playgroud)

slide_in_up

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_longAnimTime"
    android:fromYDelta="0%p"
    android:toYDelta="100%p" />
Run Code Online (Sandbox Code Playgroud)

slide_out_up

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_longAnimTime"
    android:fromYDelta="100%p"
    android:toYDelta="0%p" />
Run Code Online (Sandbox Code Playgroud)

我真正想要实现的是让新片段从底部滑入.我的动画被忽略了.什么是缺少的代码?

Tyl*_*vis 30

transaction.setCustomAnimations(R.anim.slide_in_up, R.anim.slide_out_up);
transaction.addToBackStack(null);
transaction.replace(R.id.my_fragment, newFrag);
Run Code Online (Sandbox Code Playgroud)

slide_in_up

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_longAnimTime"
    android:fromYDelta="100%p"
    android:toYDelta="0%p" />
Run Code Online (Sandbox Code Playgroud)

slide_out_up

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_longAnimTime"
    android:fromYDelta="0%p"
    android:toYDelta="-100%p" />
Run Code Online (Sandbox Code Playgroud)


Kas*_*enk 18

自从提出这个问题以来已经有一段时间了,但这里是其他人来到这里的答案:

e1da是正确的,因为setCustomAnimation()之前必须调用该呼叫replace().否则动画将不会显示.
第二个问题是您可能正在使用无法使用视图动画设置动画的本机片段.

使用以下文件:

slide_in_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true" >
    <objectAnimator
        android:duration="500"
        android:propertyName="y"
        android:valueFrom="1280"
        android:valueTo="0"
        android:valueType="floatType" />
</set>
Run Code Online (Sandbox Code Playgroud)

slide_out_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true" >
    <objectAnimator
        android:duration="500"
        android:propertyName="y"
        android:valueFrom="0"
        android:valueTo="-1280"
        android:valueType="floatType" />
</set>
Run Code Online (Sandbox Code Playgroud)

一点解释:
您必须区分一方面支持片段的视图动画和另一方面本机片段的属性动画.

查看动画:
是预备android 3.0的方式来动画视图.此示例代码是slide_in.xml和用户slide_up.xml3093402

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_longAnimTime"
android:fromYDelta="0%p"
android:toYDelta="100%p" />
Run Code Online (Sandbox Code Playgroud)

值得一提的是,您无法使用视图动画制作片段动画.例外是来自支持库(android.support.v4.app.Fragment)的片段.

属性动画
这是在android 3.0之后动画对象的方法.它也被声明为.xml文件,但使用"valueAnimator"标记(objectAnimator扩展valueAnimator).例子就是问题的答案.这是本机片段(android.app.Fragment)可以动画的方式.

也可以看看:

希望这有帮助,

编辑:正如Raphael Royer-Rivard指出的那样,固定屏幕尺寸是不好的做法.最好使用OS中的常量 getWindowManager().getDefaultDisplay().getMetrics(metrics).xdpi (参见DisplayMetrics).但我有一段时间没有做任何Android开发,所以我不知道哪一个.

  • 我相信使用1280的硬编码高度值是一件非常糟糕的事情.如果屏幕大于那个怎么办? (4认同)

小智 11

slide_in_up的代码:

<?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <translate xmlns:android="http://schemas.android.com/apk/res/android"
            android:duration="@android:integer/config_mediumAnimTime"
            android:fromYDelta="100%p"
            android:toYDelta="0%p" />
    </set>
Run Code Online (Sandbox Code Playgroud)

slide_in_down的代码:

<?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <translate xmlns:android="http://schemas.android.com/apk/res/android"
           android:duration="@android:integer/config_mediumAnimTime"
           android:fromYDelta="0%p"
           android:toYDelta="100%p" />
    </set>
Run Code Online (Sandbox Code Playgroud)

slide_out_up的代码:

<?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
       <translate
          android:duration="@android:integer/config_mediumAnimTime"
          android:fromXDelta="0"
          android:toYDelta="100%" />
    </set>
Run Code Online (Sandbox Code Playgroud)

slide_out_down的代码:

<?xml version="1.0" encoding="utf-8"?>
   <set xmlns:android="http://schemas.android.com/apk/res/android">
        <translate
          android:duration="@android:integer/config_mediumAnimTime"
          android:fromXDelta="0"
          android:toYDelta="-100%" />
   </set>
Run Code Online (Sandbox Code Playgroud)

然后在你的活动或片段集动画如下:

    Fragment fragment = new Fragment();
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.setCustomAnimations(R.anim.slide_in_up, R.anim.slide_in_down, R.anim.slide_out_down, R.anim.slide_out_up);
    transaction.replace(container, fragment).commit();
Run Code Online (Sandbox Code Playgroud)


Ixx*_*Ixx 7

目前与android.transition此一样简单fragment.enterTransition = Slide()fragment.enterTransition = Fade()

注:最低版本 L。