3

Я создаю приложение для Android, где каждый фрагмент привязан к пользовательской анимации влево-вправо. То, что я достиг, используя класс Custom Property Animation (FractionLinearLayout.java, приведенный ниже). У моего приложения несколько Fragment, переключение между этими фрагментами сопровождается анимацией с левого слайда. Все работает идеально, пока я не отключу анимацию из параметров разработчика для целей тестирования.Пользовательская анимация свойств, не работающая над отключением анимации

Ничего не появляется, когда я отключу анимацию. Я вижу, что logcats означает, что приложение работает идеально, только просмотры не загружаются (может быть) из-за пользовательских свойств FractionTranslationX и FractionTranslationY.

Кто-нибудь прошел через эту проблему? Заранее спасибо.

FractionLinearLayout.java: пользовательский класс для анимации

public class FractionLinearLayout extends LinearLayout { 

    DisplayMetrics matrics = getContext().getResources().getDisplayMetrics(); 

    public FractionLinearLayout(Context context, AttributeSet attrs, 
           int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     // TODO Auto-generated constructor stub 
    } 

    public FractionLinearLayout(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 

    } 

    public FractionLinearLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     // TODO Auto-generated constructor stub 
    } 

    public float getFractionTranslationX() { 

     return getWidth() > 0 ? super.getTranslationX()/getWidth() : Float.MAX_VALUE; 
    } 

    public void setFractionTranslationX(float translationX) { 

     int width = getWidth(); 
     super.setTranslationX(width > 0 ? width * translationX : Float.MAX_VALUE); 
    } 

    public float getFractionTranslationY() { 

     return getHeight() > 0 ? super.getTranslationX()/getHeight() : Float.MAX_VALUE; 
    } 

    public void setFractionTranslationY(float translationY) { 
     int height = getHeight(); 
     super.setTranslationY(height > 0 ? height * translationY : Float.MAX_VALUE); 
    } 

    public float getAnimWidth() { 

     return getLayoutParams().width; 
    } 

    public void setAnimWidth(int animWidth) { 

     getLayoutParams().width = animWidth; 
     requestLayout(); 
    } 
} 

расположение файла фрагмента:

fragment_main_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<com.bbi.views.FractionLinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@drawable/esc_app_background" 
    android:orientation="vertical"> 
........... 
........... 
</com.bbi.views.FractionLinearLayout> 

Пользовательские анимации XML файл:

alide_in_left.xml

<?xml version="1.0" encoding="utf-8"?> 
<set 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:interpolator="@android:anim/decelerate_interpolator"> 
    <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" 
     android:duration="@integer/animation_time" 
     android:propertyName="fractionTranslationX" 
     android:valueFrom="1" 
     android:valueTo="0" 
     android:valueType="floatType" /> 

</set> 

slide_out_left.xml

<?xml version="1.0" encoding="utf-8"?> 
<set 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:interpolator="@android:anim/accelerate_interpolator"> 
    <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" 
     android:duration="@integer/animation_time" 
     android:propertyName="fractionTranslationX" 
     android:valueFrom="0" 
     android:valueTo="-1" 
     android:valueType="floatType" /> 

</set> 

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

getFragmentManager().beginTransaction() 
       .setCustomAnimations(R.anim.slide_in_left;, R.anim.slide_out_left) 
       .replace(R.id.frameTopContainer, newsToolFragment) 
       .commitAllowingStateLoss(); 

Когда я заменить com.views.FractionLinearLayout на LinearLayout в fragment_main_layout.xml, все работает отлично (не анимация очевидно, поскольку я отключил анимацию и удалил пользовательскую анимацию свойств).

ответ

1

Наконец-то решила мою проблему, прочитав animation_scale флаг и удалив метод setCustomAnimations() в соответствии с этим.

+0

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

0

Проблема заключается в том, что вы отключили анимацию, аниматор позвонит setFractionTranslationX(), чтобы передать начальное значение и окончательное значение одновременно, и было бы очень ранним моментом, когда ваш вид еще не имеет ширины и высоты, поэтому вы будете переводить свой взгляд на Float.MAX_VALUE каждый раз.

Чтобы правильно установить вид х и у позиции, когда анимация включения или нет, вы можете:

private float mXFraction; 
private float mYFraction; 


@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    super.onLayout(changed, l, t, r, b); 

    setFractionTranslationX(mXFraction); 
    setFractionTranslationY(mYFraction); 
} 


public float getFractionTranslationX() { 
    return mXFraction; 
} 

public void setFractionTranslationX(float xFraction) { 
    mXFraction = xFraction; 

    int width = getWidth(); 
    if (width > 0) setTranslationX(xFraction * width); 
} 

public float getFractionTranslationY() { 
    return mYFraction; 
} 

public void setFractionTranslationY(float yFraction) { 
    mYFraction = yFraction; 

    int height = getHeight(); 
    if (height > 0) setTranslationY(yFraction * height); 
}