如何读取 Marshmallow 中的动画比例持续时间标志

How to read Animation scale duration flag in Marshmallow

我在 Marshmallow 中读取 Animation scale duration 标志时遇到问题。相同的代码适用于早期版本的 Marshmallow (6.0.0)。

我正在使用 android.app.Fragment.setCustomTransition() 方法制作片段动画。当 developer option settings 中的动画比例持续时间为 0 时,片段不会显示。所以我不得不在这种情况下禁用动画。

我的代码片段:

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,即使动画缩放持续时间不为 0。

有人遇到过这个问题吗?

编辑1

以下是我使用 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();
}

编辑2

这里是自定义 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();
    }
}

我的 FractionLinearLayout class 有问题。在 set setFractionTranslationX() 方法中,getWidth() 在第一次调用时返回 0。这导致我的代码在动画关闭时阻止 Fragment 出现。现在我用 getResources().getDisplayMetrics().widthPixels 替换了 getWidth() 行,一切正常。

更新代码:

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

但我仍然不知道,为什么 ANIMATOR_DURATION_SCALE 标志在 Marshmallow 中不起作用。