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問題は、アニメーション スケールの継続時間が 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();
    }
}
4

1 に答える 1

0

FractionLinearLayoutクラスで問題が発生しました。set 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();
    }
}

しかし、それでもわからないのですがANIMATOR_DURATION_SCALE、Marshmallow でフラグが機能しないのはなぜですか。

于 2016-04-20T11:29:59.650 に答える