【问题标题】:Animate fragments content before closing it在关闭之前对片段内容进行动画处理
【发布时间】:2016-10-20 13:14:24
【问题描述】:

我正在显示FrameLayout,其中包含Fragment 中的一些组件。在onCreateView(..) 中,我正在为FrameLayout 的内容制作动画,一切正常。现在我想在关闭Fragment 之前为内容制作动画。

在我当前的解决方案中,我在父 Activity 中覆盖 onBackPressed(),然后我在 Fragment 中调用方法 onBackPressed() 并在那里为内容设置动画。这个解决方案的问题是,我想从各种活动中膨胀Fragment,然后这不是一个很好的解决方案......有人知道更好的方法吗?

感谢您的帮助!

注意:

我也尝试过覆盖onCreateView()onPause(),但如果我在这些方法中启动它,动画不会显示

下面的方法也不能满足我的要求,因为它为整个片段设置动画,我想为内容设置动画

getActivity().getSupportFragmentManager()
            .beginTransaction()
            .setCustomAnimations(R.anim.slide_in_up, R.anim.slide_out_up, R.anim.slide_out_down, R.anim.slide_in_down)

【问题讨论】:

  • onDestroyView() 本身的Fragment 有什么问题?
  • 我已经尝试为 onDestroyView()onPause() 中的内容设置动画,但它们都不起作用..

标签: android animation fragment


【解决方案1】:

也许您可以尝试在您的fragment 中处理onBackPressed,如下所示:

    yourRootLayout.setFocusableInTouchMode(true);
    yourRootLayout.requestFocus();
    yourRootLayout.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {

            if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){
                animateMyViews();
                return true;
            }
            return false;
        }
    });

【讨论】:

  • 成功了,谢谢!我只改变了一件事:我用我的 rootLayout 替换了 getView() 因为 getView() 在 onCreateView 中返回 null
  • 当然。抱歉,我忘记添加我的代码示例应该在 onResume 中运行
【解决方案2】:

我想在关闭视图/片段之前执行滑动退出动画。 这些是我执行的步骤:

  1. 我创建了一个可以关闭当前屏幕的可运行任务。
  2. 将该可运行文件传递给动画视图。
  3. 使用 view.postOnAnimationDelayed(runnable, 400) 以便它可以在 400 毫秒后为可运行对象设置动画并执行。
  4. 此外,我确保我的动画持续时间 >= 400,以便过渡平滑。

下面是idea代码的一些改动版本。

我使用 view.postOnAnimationDelayed(runnable, 400) 来

Dialog dialog = new Dialog(getActivity(), getTheme()) {
            @Override
            public void onBackPressed() {
                ParentFragment.this.onBackPressed();
                Runnable runnable = new Runnable() {
                    @Override
                    public void run() {
                        //Referencing this class in runnable
                        getInstance().dismiss();
                    }
                };
             
             //webView is the child view loaded on this fragment
             if(webView != null && webView.webViewClient != null) {
                webView.webViewClient.animateClose(webView, runnable);
             } else {
                super.dismiss();
             }
        };

webViewClient 中的 animateOnClose 函数如下所示:

public void animateClose(final WebView view, Runnable runnable) {
  Animation anim = AnimationUtils.loadAnimation(getMainActivityContext(),
               animationResource);
        view.startAnimation(anim);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            view.postOnAnimationDelayed(runnable, 400);
            // you can also try view.postOnAnimation(runnable);
        } else {
            runnable.run();
        }
}

【讨论】:

    【解决方案3】:

    我认为你需要通知Fragment你即将销毁它。

    粗略的伪代码可能看起来像

    myFragment.aboutToClose();
    

    在您的FragmentaboutToClose() 方法中。

    public void aboutToClose()
    {
        //  Perform all the animations you want.
        //  Don't forget to add onAnimationEnd() call back.
    
        onAnimationEnd()
        {
            // Notify Activity that Animations have completed.
            callback.animationsCompleted();
        }
    }
    

    终于在你的电话Activity

    public void animationsCompleted()
    {
        //  Destroy fragment.
        getActivity().getSupportFragmentManager()
            .beginTransaction()
            .setCustomAnimations(R.anim.slide_in_up, R.anim.slide_out_up, R.anim.slide_out_down, R.anim.slide_in_down);
    }
    

    【讨论】:

    • 谢谢,但我正在寻找一个解决方案,我不需要更改活动中的任何代码,因为我想从各种活动中膨胀片段
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多