2016-04-15 3 views
0

Я столкнулся с проблемой во время чтения Animation scale duration Флаг в Зефир. Тот же код работает в более ранней версии Marshmallow (6.0.0).Как читать Флаг продолжительности анимации в Зефире

Я использую метод анимации фрагментов android.app.Fragment.setCustomTransition(). Когда продолжительность анимации равна 0 в developer option settings, фрагменты не отображаются. Поэтому мне пришлось отключить анимацию над этим условием.

Мой фрагмент кода:

public static boolean isAnimationOff() 
    { 
     final float animatorSpeed; 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) 
     { 
      animatorSpeed = Settings.Global.getFloat(
        context.getContentResolver(), 
        Settings.Global.ANIMATOR_DURATION_SCALE, 
        0); 
     } 
     else 
     { 
      animatorSpeed = Settings.System.getFloat(
        context.getContentResolver(), 
        Settings.System.ANIMATOR_DURATION_SCALE, 
        0); 
     } 
     return animatorSpeed == 0; 
    } 

Проблема заключается в том: этот код возвращается true на каждом Invoke, даже если продолжительность анимации масштаб не равен 0.

Кто-нибудь сталкивался с этой проблемы?

Edit1

Ниже приведен фрагмент кода, где я использую isAnimationOff() метод для загрузки фрагмента:

private void loadFragment(Fragment fragment) 
{ 
    FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
    if (!Constants.isAnimationOff()) 
     transaction.setCustomAnimations(animSlideIn, animSlideOut); 
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE).replace(R.id.frameTopContainer, fragment) 
      .commitAllowingStateLoss(); 
} 

edit2

Вот обычай LinearLayout, который имеет настраиваемое свойство:

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(); 
    } 
} 
+0

что на самом деле вам нужен метод isAnimationOff для? – pskink

+0

Я проверяю, если масштаб анимации равен 0 (анимация отключена от настроек опций разработчика). если не вызывается 'setCustomTransition()' else, а не вызывается. – chandil03

+0

@pskink любая удача. – chandil03

ответ

0

У меня была проблема в классе FractionLinearLayout. В наборе setFractionTranslationX() метод, getWidth() возвращал 0 при первом же вызове. Это привело к моему коду, чтобы предотвратить появление фрагмента, когда анимация отключена. Теперь я заменил строку getWidth()getResources().getDisplayMetrics().widthPixels, и все работает нормально.

Обновленный код:

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() : 0; 
    } 

    public void setFractionTranslationX(float translationX) 
    { 
     int width = getResources().getDisplayMetrics().widthPixels; 
     super.setTranslationX(width > 0 ? width * translationX : 0); 
    } 

    public float getFractionTranslationY() 
    { 

     return getHeight() > 0 ? super.getTranslationY()/getHeight() : 0; 
    } 

    public void setFractionTranslationY(float translationY) 
    { 
     int height = getResources().getDisplayMetrics().heightPixels; 
     super.setTranslationY(height > 0 ? height * translationY : 0); 
    } 

    public float getAnimWidth() 
    { 

     return getLayoutParams().width; 
    } 

    public void setAnimWidth(int animWidth) 
    { 

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

Но все же я не knowl, почему ANIMATOR_DURATION_SCALE флаг не работает в Зефир.