0

Я просто хочу сказать, что это не является дубликатом, этот вопрос не был рассмотрен на переполнение стекаФрагмент Переход анимации с использованием Аниматор Объект не работает

У меня есть несколько фрагментов в приложение, которое позволяет пользователю перейти через. У меня была библиотека поддержки в моем коде, но с тех пор я удалил ее, когда я использовал ее, я анимировал фрагменты с помощью <translate>. Я теперь изменил это, чтобы это отлично работало, если я жестко кодировал значения в и из. Поскольку мое приложение будет использоваться на разных плотностях экрана, я не могу этого сделать. Таким образом, после исследования и учебники я создали свой обычай FrameLayout следующим образом:

public class CustomFrameLayout extends FrameLayout{ 

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


    public float getXFraction() { 
     return getX()/getWidth(); // TODO: guard divide-by-zero 
    } 

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

моя анимация XML является:

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

и моя основная раскладка деятельности:

<com.axn.test.app.custom.CustomFrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/container" 
    android:gravity="top" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

Я тогда есть код для настройки пользовательских анимаций:

FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction(); 
     ft.setCustomAnimations(R.animator.fragment_slide_in_right, R.animator.fragment_slide_in_right, R.animator.fragment_slide_in_right, R.animator.fragment_slide_out_right); 

Проблема заключается в том, когда я меняю фрагменты нет анимации и я получаю следующее в консоли:

W/PropertyValuesHolder﹕ Method setXFraction() with type float not found on target class class android.widget.RelativeLayout 

Так что, если кто-то пришел через это в прошлом, или знает, как решить эту проблему, я был бы признателен Это. в моем customFrameLayout setXFraction(float xFraction) и getXFraction() никогда не называются, так что я не знаю, куда идти отсюда ... все входные высоко оценили

** EDIT ==== ФРАГМЕНТ РАСПОЛ ===== **

<?xml version="1.0" encoding="utf-8"?> 

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

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <RelativeLayout 
      android:layout_marginTop="20dp" 
      android:layout_marginLeft="20dp" 
      android:id="@+id/show1" 
      android:layout_weight="1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:clickable="true"> 

      <ImageView 
       android:id="@+id/poster1" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:background="@drawable/poster1"/> 
      <RelativeLayout 
       android:id="@+id/poster1Details" 
       android:background="@drawable/reflection1" 
       android:layout_below="@+id/poster1" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content"> 
       <TextView 
        android:id="@+id/poster1text" 
        android:layout_centerHorizontal="true" 
        android:textColor="@color/white" 
        android:textAppearance="?android:attr/textAppearanceMedium" 
        android:text="@string/poster1Title" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        /> 
       <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_below="@+id/poster1text" 
        android:layout_centerHorizontal="true" 
        android:textColor="@color/white" 
        android:textAppearance="?android:attr/textAppearanceSmall" 
        android:text="@string/episode1"/> 
      </RelativeLayout> 
     </RelativeLayout> 

     <RelativeLayout 
      android:id="@+id/show2" 
      android:layout_weight="1" 
      android:layout_marginRight="10dp" 
      android:layout_marginTop="20dp" 
      android:layout_marginLeft="10dp" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:clickable="true"> 

      <ImageView 
       android:id="@+id/poster2" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:background="@drawable/poster2"/> 
      <RelativeLayout 
       android:id="@+id/poster2Details" 
       android:background="@drawable/reflection2" 
       android:layout_below="@+id/poster2" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content"> 
       <TextView 
        android:id="@+id/poster2text" 
        android:layout_centerHorizontal="true" 
        android:textColor="@color/white" 
        android:textAppearance="?android:attr/textAppearanceMedium" 
        android:text="@string/poster2Title" 
        android:gravity="center" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        /> 
       <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_below="@+id/poster2text" 
        android:layout_centerHorizontal="true" 
        android:textColor="@color/white" 
        android:textAppearance="?android:attr/textAppearanceSmall" 
        android:text="@string/episode1"/> 

      </RelativeLayout> 
     </RelativeLayout> 
    </LinearLayout> 

    <RelativeLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true"> 

    <ImageView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@drawable/logos_backgrounds" 
     /> 
     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/presents" 
      android:textColor="@color/white" 
      android:layout_centerHorizontal="true" 
      android:layout_marginTop="10dp" 
      /> 
    </RelativeLayout> 
</RelativeLayout> 
+0

Что такое макет вашего фрагмента? –

+0

Я включу это в редактирование ... У меня есть несколько фрагментов с разными макетами –

+1

Там вы идете. Вы пытаетесь анонимать фрагмент. Не деятельность. Поэтому вам нужно добавить 'CustomFrameLayout' на фрагмент, для которого вы настраиваете анимацию. –

ответ

0

Проблема в том, что вы пытаетесь анимировать фрагмент. Не деятельность. Поэтому вам нужно добавить CustomFrameLayout на фрагмент, для которого вы устанавливаете анимацию. После совершения транзакции транзакция будет анимировать значения родителя вашего фрагмента, а не вашей активности. Вот почему вы получаете Method setXFraction() with type float not found on target class class android.widget.RelativeLayout. Поскольку родительский элемент вашего фрагмента является RelativeLayout и у него нет метода setXFraction.

Все еще я оставлю остальную часть anwser ниже, потому что это может помочь другим.

in_from_left.xml

<objectAnimator 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:duration="500" 
    android:propertyName="x" 
    android:valueFrom="1000" 
    android:valueTo="0" 
    android:valueType="floatType" /> 

in_from_right.xml

<?xml version="1.0" encoding="utf-8"?> 

<objectAnimator 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:duration="500" 
    android:propertyName="x" 
    android:valueFrom="0" 
    android:valueTo="1000" 
    android:valueType="floatType" /> 

И моя сделка выглядит следующим образом:

FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
transaction.setCustomAnimations(R.anim.in_from_left, R.anim.in_from_right, R.anim.in_from_left, R.anim.in_from_right); 
transaction.add(R.id.container,myFragment,"tag"); 
transaction.commit(); 
+1

привет, спасибо за это, но проблема в том, что это набор из точки ... где, как если бы я использовал, что есть проблемы с ui, фрагменты не объединены во время анимации –

+0

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