【问题标题】:How would I do this Fragment animation on API level 9 with nineoldandroids?我将如何使用 Nineoldandroids 在 API 级别 9 上执行此片段动画?
【发布时间】:2014-10-30 19:45:00
【问题描述】:

我正在尝试执行一个动画,其中我有两个片段堆叠在一起。

顶部片段是细节片段。 底部片段是一个菜单列表视图片段。

我通过在活动布局中创建两个重叠的框架布局来做到这一点。我希望能够制作一个动画,其中背景片段将以类似于 门打开 的方式显示,只留下顶部片段边缘的 20%。

我尝试使用 API 9 可用的标准视图动画库来制作此动画,但似乎只有像素被移动,但触摸映射仍然对应于顶部片段并且无法访问底部菜单片段。

所以我下载了 Nineoldandroids 库并尝试使用带有 ObjectAnimators 的 AnimatorSet 来制作动画……除了这次片段被动画化时,它只显示灰色背景,而不是像以前那样在后面的片段。

这是一段关于我如何尝试实现简单翻译以显示背景片段的代码 sn-p

  private void animateFragmentOut() {
        activeFragment = (Fragment)getSupportFragmentManager().findFragmentById(R.id.nav_item_fragment_container);
        View myView = activeFragment.getView();
    AnimatorSet set = new AnimatorSet();
    set.playTogether(
            ObjectAnimator.ofFloat(myView, "translationX", 0, 230)
    );
    set.setDuration(500).start();

}

为什么我使用这个动画时背景片段不显示? 如何使用 Nineoldandroids 正确显示背景片段?

【问题讨论】:

    标签: java android animation nineoldandroids


    【解决方案1】:

    我最终解决了这个问题,方法是使用侦听器在动画开始时使用以下代码膨胀背景视图

    private void animateFragmentOut() {
            activeFragment = (Fragment)getSupportFragmentManager().findFragmentById(R.id.nav_item_fragment_container);
            View myView = activeFragment.getView();
    
        Animator.AnimatorListener listener = new AnimatorListenerAdapter() {
            @Override
            public void onAnimationStart(Animator animation) {
                launchNavigationFragment();
            }
    
            @Override
    
            public void onAnimationEnd(Animator animation) {
            }
        };
    
    
        ObjectAnimator rotateY = ObjectAnimator.ofFloat(myView,"rotationY",-15f);
        ObjectAnimator scaleX = ObjectAnimator.ofFloat(myView,"scaleX",0.8f);
        ObjectAnimator scaleY = ObjectAnimator.ofFloat(myView,"scaleY", 0.8f);
        ObjectAnimator translateX = ObjectAnimator.ofFloat(myView,"translationX",400f);
    
        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.playTogether(rotateY,scaleX,scaleY,translateX);
        animatorSet.addListener(listener);
        animatorSet.setDuration(700);
        animatorSet.start();
    }
    

    Saldy 尽管这在 API 级别 11 上运行良好> 以及在我的 API 9 设备上我仍然遇到与标准动画库相同的问题。视图像素平移,但触摸区域保持映射在同一位置。所以我无法与背景导航菜单片段交互。

    【讨论】:

    • 这是因为 std Animations 和 Nineoldandroid 都只以动画形式绘制视图,但无论如何它们不会对视图进行物理转换(只有“外观”而不是“外观”)
    • 所以我一直在计算旧 API 的新位置,对吧?有没有关于如何做到这一点的好资源?我一直在尝试,但我认为我不太了解每个人是如何做到的
    • 动画的标准方法是设置一个动画监听器 startAnimation() 并在 onAnimationEnd 将视图移动到一个新位置
    • 我明白,但是当我尝试做类似 FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(myView.getWidth(),myView.getHeight()); myView.setLayoutParams(lp);它似乎不起作用
    猜你喜欢
    • 2013-11-05
    • 2020-05-13
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 2014-03-08
    • 2020-04-16
    • 2011-02-03
    相关资源
    最近更新 更多