禁用动画后自定义属性动画无法正常工作

3
我正在创建一个Android应用程序,其中每个片段都绑定到自定义的从左到右滑动动画。我使用Custom Property Animation(下面给出的FractionLinearLayout.java类)实现了这一点。我的应用程序有几个Fragment,在这些片段之间切换会出现从右到左的滑动动画。一切都很完美,直到我为了测试目的禁用了开发人员选项中的动画。
当我禁用动画时,什么也没有出现。我可以看到logcat,这意味着应用程序运行得很完美,只是视图没有被加载,可能是因为自定义属性FractionTranslationXFractionTranslationY
有人遇到过这个问题吗?提前致谢。
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>

在Activity中添加片段的代码:

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

当我在fragment_main_layout.xml中将com.views.FractionLinearLayout替换为LinearLayout时,一切都正常工作(没有动画,因为我已经禁用了动画并删除了属性自定义动画)。

2个回答

1
最终通过读取animation_scale标志并根据其删除setCustomAnimations()方法来解决了我的问题。

我认为问题在于自定义动画的实现方式,通过读取系统标志来跳过设置动画根本不被推荐,因为这不是正常的做法,也没有人会期望使用你的视图时需要这样做。 - Rex Lam

0
问题在于当您禁用动画时,动画器将调用setFractionTranslationX()同时传递初始值和最终值,而此时您的视图尚未具有宽度和高度,因此每次都会将视图转换为Float.MAX_VALUE。
为了正确设置您的视图x和y位置,无论动画是否启用,您可以:
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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接