2013-12-17 4 views
18

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

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

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

+0

transaction.commit(): P – Pankaj

ответ

14

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

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).

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

Надеется, что это помогает,
Каю

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

+0

с помощью просмотра анимации для фрагментов поддержки. при попытке slide_out_up фрагмент не выходит из экрана, но сжимается снизу вверх. –

+2

Я считаю, что использование жестко заданного значения высоты 1280 - это очень плохо. Что делать, если экран больше? –

+0

Вы правы, добавили изменения. – Kaschwenk

19
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

Он будет работать только с поддержкой библиотеки. Что относительно API> = 11 без него? – Antoniossss

-1

здесь полный рабочий пример

Нажатие кнопки переключает между 2 фрагментами А и В (слайд анимации справа налево) , Фрагменты - это просто глупый текст (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> 

вне.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> 
7

код 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(); 
0

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

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

, но не указаны xml-файлы – Antoniossss

Смежные вопросы