如何在Android上实现流畅的片段交易动画

凯夫

我主要使用iOS,并且已经习惯了非常流畅和流畅的屏幕切换动画。我现在正在开发一个Android应用程序,在我的一生中无法获得片段事务来平滑地添加/替换片段。

我的设置如下:MainActivity具有一个FrameLayoutxml,我立即将其加载FragmentAMainActivityOnCreate我的应用程序,然后进行更换MainActivityFrameLayoutFragmentBFragmentC,等。因此我的整个应用程序有1个活动。

在单击按钮时,我调用以下命令来添加/替换当前片段:

        getFragmentManager()
            .beginTransaction()
            .setCustomAnimations(R.animator.slide_in, android.R.animator.fade_out, android.R.animator.fade_in, R.animator.slide_out)
            .addToBackStack(null)
            .add(R.id.fragment_1, fragment)
            .commit();

slide_in.xml看起来像(slide_out.xml显然相反):

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

滑入和滑出我正在为xFraction设置动画,我将其子类化为LinearLayout

public class SlidingLinearLayout extends LinearLayout {

    private float yFraction = 0;
    private float xFraction = 0;

    public SlidingLinearLayout(Context context) {
        super(context);
    }

    public SlidingLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SlidingLinearLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    private ViewTreeObserver.OnPreDrawListener preDrawListener = null;

    public void setYFraction(float fraction) {

        this.yFraction = fraction;

        if (getHeight() == 0) {
            if (preDrawListener == null) {
                preDrawListener = new ViewTreeObserver.OnPreDrawListener() {
                    @Override
                    public boolean onPreDraw() {
                        getViewTreeObserver().removeOnPreDrawListener(preDrawListener);
                        setYFraction(yFraction);
                        return true;
                    }
                };
                getViewTreeObserver().addOnPreDrawListener(preDrawListener);
            }
            return;
        }

        float translationY = getHeight() * fraction;
        setTranslationY(translationY);
    }

    public float getYFraction() {
        return this.yFraction;
    }

    public void setXFraction(float fraction) {

        this.xFraction = fraction;

        if (getWidth() == 0) {
            if (preDrawListener == null) {
                preDrawListener = new ViewTreeObserver.OnPreDrawListener() {
                    @Override
                    public boolean onPreDraw() {
                        getViewTreeObserver().removeOnPreDrawListener(preDrawListener);
                        setXFraction(xFraction);
                        return true;
                    }
                };
                getViewTreeObserver().addOnPreDrawListener(preDrawListener);
            }
            return;
        }

        float translationX = getWidth() * fraction;
        setTranslationX(translationX);
    }

    public float getxFraction() {
        return xFraction;
    }
}

所以我的问题是大多数时候,当我最初单击一个按钮来添加/替换片段时,我没有得到一个动画,它只是突然弹出。但是,当我按下“后退”按钮并且片段从后堆栈弹出时,动画执行的次数超过了预期。我觉得这是尝试动画时初始化的问题。当片段在内存中并且在屏幕外进行动画处理时,它比创建新片段然后在屏幕上进行动画处理要好得多。我很好奇其他人是否经历过这种情况,以及他们如何解决。

这是困扰我真正想要休息的Android开发经验的烦恼!任何帮助将不胜感激。谢谢!

亚龙马力诺

以我的经验,如果片段在负载上做过多的工作,那么系统基本上将跳过输入动画并仅显示片段。在我的情况下,解决方案是在onCreateAnimation中创建一个动画侦听器,以等到输入动画完成后再进行导致动画被跳过的过程密集型工作。

@Override
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
    if (nextAnim == 0) {
        return super.onCreateAnimation(transit, enter, nextAnim);
    }

    Animation anim = android.view.animation.AnimationUtils.loadAnimation(getContext(), nextAnim);
    anim.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {}
        @Override
        public void onAnimationEnd(Animation animation) {
            // Do any process intensive work that can wait until after fragment has loaded
        }

        @Override
        public void onAnimationRepeat(Animation animation) {}
    });
    return anim;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在MobilePay上实现打印收据的android动画?

来自分类Dev

动画不同步,如何实现流畅的动画?

来自分类Dev

如何在CSS中制作流畅的动画?

来自分类Dev

如何在CSS中制作流畅的动画?

来自分类Dev

如何在Android Wear上实现“在手机上打开”动画

来自分类Dev

如何使动画流畅?

来自分类Dev

Android-查看通货膨胀搞乱了片段交易动画

来自分类Dev

片段-等待交易动画完成

来自分类Dev

如何在UITableViewCell上实现滑动动画

来自分类Dev

如何在UITableViewCell上实现滑动动画

来自分类常见问题

如何在Android Studio中的片段中实现onback press

来自分类Dev

如何在片段Android中实现视差滚动

来自分类Dev

如何在 Android 上裁剪动画 GIF?

来自分类Dev

如何在Android上的TextVIew上在5秒内实现从0到600的数字动画增加

来自分类Dev

如何在视图分页器的片段之间实现不同的动画过渡

来自分类Dev

如何在knex中实现交易?

来自分类Dev

如何在Android中实现类似UBER主屏幕的动画?

来自分类Dev

如何在Android中实现循环检查/勾选动画?

来自分类Dev

如何在Android上实现OnClickListener

来自分类Dev

如何在Android上实现Couchbase Lite?

来自分类Dev

如何在Android上实现离线模式

来自分类Dev

如何在Android上实现PBAP

来自分类Dev

如何在Android上实现时间

来自分类Dev

如何使此动画更流畅?

来自分类Dev

在Android上为片段实现OnClickListener

来自分类Dev

如何在片段交易中添加标签?

来自分类Dev

如何在按钮上运行代码单击Android片段

来自分类Dev

如何在Xamarin Android上的片段中设置actionBar?

来自分类Dev

如何在Android的NavigationView上显示活动或片段?

Related 相关文章

热门标签

归档