it-roy-ru.com

Переход Android фрагмент слайд вверх

У меня есть фрагмент, который должен заменить другой фрагмент. Я хочу указать анимацию. Но анимация игнорируется.

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

Все, чего я действительно пытаюсь добиться - это чтобы новый фрагмент скользил снизу. Мои анимации игнорируются. Какой код отсутствует?

22
user3093402
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" />
25
Tyler Davis

Прошло некоторое время с тех пор, как этот вопрос был задан, но вот ответ для других людей, приезжающих сюда:

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 способ анимации просмотров. Пример кода для этого - slide_in.xml и slide_up.xml от user3093402

<?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-файлы, но использует тег «valueAnimator» (objectAnimator расширяет valueAnimator). Примеры приведены в ответе на вопрос .. Именно так можно анимировать нативные фрагменты (Android.app.Fragment).

Смотрите также:

Надеюсь это поможет,
Kai

EDIT: Как отметил Рафаэль Ройер-Ривар, фиксированный размер экрана - плохая практика. Было бы лучше использовать константу из ОС, как в getWindowManager().getDefaultDisplay().getMetrics(metrics).xdpi (См. DisplayMetrics ). Но я некоторое время не занимался разработкой для Android, поэтому не знаю, какая именно.

16
Kaschwenk

код для 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();
10
Moaz H

В настоящее время с Android.transition это так же просто, как fragment.enterTransition = Slide() или fragment.enterTransition = Fade()

Примечание: минимальная версия L.

0
Ixx

R.anim не будет работать там, но R.animator сделает . Например

transaction.setCustomAnimations(Android.R.animator.fade_in, Android.R.animator.fade_out);
0
Rahul Singh