转换android片段向上滑动

时间:2013-12-17 00:10:43

标签: android android-layout animation android-fragments

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

transaction.replace(R.id.my_fragment, newFrag);
transaction.addToBackStack(null);
transaction.setCustomAnimations(R.anim.slide_in_up, R.anim.slide_out_up);

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" />

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" />

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

7 个答案:

答案 0 :(得分:26)

transaction.setCustomAnimations(R.anim.slide_in_up, R.anim.slide_out_up);
transaction.addToBackStack(null);
transaction.replace(R.id.my_fragment, newFrag);

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" />

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" />

答案 1 :(得分:17)

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

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>

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>

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

查看动画:
是预备android 3.0的方式动画视图。此示例代码为user {3}}的slide_in.xmlslide_up.xml

<?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" />

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

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

另见:

希望这有帮助,

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

答案 2 :(得分: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>

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>

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>

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>

之后在您的活动或片段集动画中如下:

    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();

答案 3 :(得分:1)

当前使用android.transition就像fragment.enterTransition = Slide()fragment.enterTransition = Fade()一样简单

注意:最低版本为L。

答案 4 :(得分:0)

R.anim不会在那里工作,但R.animator会这样做。 例如

transaction.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);

答案 5 :(得分:0)

这个答案是用 Kotlin 写的。为了这个例子,我只是根据它当前的 isHidden 属性隐藏或显示它。我正在使用 androidx.transition.Slide

链接:https://developer.android.com/reference/androidx/transition/Slide

val frag = supportFragmentManager.findFragmentById(R.id.frag_id_from_xml_layout)
frag?.let {
    val ft = supportFragmentManager.beginTransaction()
    frag.enterTransition = Slide()
    frag.exitTransition = Slide()
    if (frag.isHidden) ft.show(frag) else ft.hide(frag)
    ft.commit()
}

答案 6 :(得分:-1)

这是完整的工作示例

按此按钮可在2个片段A和B之间切换(通过从右到左的幻灯片动画)。片段只是具有不同背景的愚蠢文本(AAAAAA和BBBBB)。

MainActivity.java

package com.example.slidetrans;

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;


public class MainActivity extends Activity {

    boolean showingA = true;
    Button button;

    A a;
    B b;

    private void incarnate(FragmentManager fm){
        int layoutId = R.id.frame;
        boolean fragmentWasNull = false;
        Fragment f = fm.findFragmentById(layoutId);
        if (f == null){
            if (showingA){
                f = a = new A();
            } else {
                f = b = new B();
            }
            fragmentWasNull = true;
        }
        if (fragmentWasNull){
            FragmentTransaction ft = fm.beginTransaction();
            ft.add(layoutId, showingA ? a : b,  "main").commit(); 
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        FragmentManager fm = getFragmentManager();
        incarnate(fm);
        button = (Button)findViewById(R.id.button);
        OnClickListener listener = new OnClickListener() {
            @Override
            public void onClick(View v) {
                FragmentManager fm = getFragmentManager();
                FragmentTransaction transaction = fm.beginTransaction();
                transaction.setCustomAnimations(R.anim.in, R.anim.out);
                transaction.replace(R.id.frame, showingA ? new B() : new A()).commit();
                showingA = !showingA;
                button.setText(showingA ? "slide in B" : "slide in A");
            }
        };
        button.setOnClickListener(listener);
    }
}

LL.java

package com.example.slidetrans;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.LinearLayout;

public class LL extends LinearLayout {

    public LL(Context context) {
        super(context);
    }

    public LL(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public float getXFraction() {
        final int width = getWidth();
        if (width != 0) return getX() / getWidth();
        else return getX();
    }

    public void setXFraction(float xFraction) {
        final int width = getWidth();
        float newWidth = (width > 0) ? (xFraction * width) : -9999;
        setX(newWidth);
    }
}

main.xml(布局)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
>
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="slide in B" />

    <FrameLayout
        android:id="@+id/frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

    </FrameLayout>

</LinearLayout>

a.xml(布局)

<?xml version="1.0" encoding="utf-8"?>
<com.example.slidetrans.LL xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#00FF00"
>

    <TextView
        android:id="@+id/aText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="AAAAAAAAAAAAAAAAAA"
        android:textSize="30sp"
        android:textStyle="bold"
    />

</com.example.slidetrans.LL>

b.xml(布局)

<?xml version="1.0" encoding="utf-8"?>
<com.example.slidetrans.LL xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#FFFF00"
>

    <TextView
        android:id="@+id/bText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        android:textStyle="bold"
        android:text="BBBBBBBBBB"
    />

</com.example.slidetrans.LL>

in.xml(anim)

<?xml version="1.0" encoding="utf-8"?>
<set  xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
    android:duration="500"
    android:interpolator="@android:anim/linear_interpolator"
    android:propertyName="xFraction"
    android:valueFrom="1.0"
    android:valueTo="0.0"
    android:valueType="floatType" />

</set>

out.xml(anim)

<?xml version="1.0" encoding="utf-8"?>
<set  xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
    android:duration="500"
    android:interpolator="@android:anim/linear_interpolator"
    android:propertyName="xFraction"
    android:valueFrom="0.0"
    android:valueTo="-1.0"
    android:valueType="floatType" />

</set>