2016-11-30 50 views
0

当我使用ViewCompat.postOnAnimation为(父视图)动画时,视图的子视图上调用setVisibility时,事情就会中断。 (setVisibility不起作用+其他一些事情会被打破)。在视图动画时调用setVisibility

问题 - 是否有任何方法的动画或解决方法,允许父母动画时调用setVisibility子项?

这是一个非常重要的请求,我认为这不是很常见,因为例如http请求会随机返回,并且视图可以在此期间随时生成动画。

码请求编辑:

关于代码,这是有点复杂。我会先解释一下。它是自定义CoordinatorLayout行为中的动画,标准BottomSheetBehavior的克隆(从下到上滑动工作表)。

动画是通过调用此推出:

ViewCompat.postOnAnimation(child, new SettleRunnable(child, targetState)); 

SettleRunnable是这样的:

private class SettleRunnable implements Runnable { 

    private final View mView; 

    @State 
    private final int mTargetState; 

    SettleRunnable(View view, @State int targetState) { 
     mView = view; 
     mTargetState = targetState; 
    } 

    @Override 
    public void run() { 
     if (mViewDragHelper != null && mViewDragHelper.continueSettling(true)) { 
      ViewCompat.postOnAnimation(mView, this); 
     } else { 
      setStateInternal(mTargetState); 
     } 
    } 
} 

因此,大家可以看到,所有的动画运动由mViewDragHelper.continueSettling完成。拖拽辅助器是标准类ViewDragHelper。

ViewDragHelper.continueSettling看起来像这样

public boolean continueSettling(boolean deferCallbacks) { 
    if (mDragState == STATE_SETTLING) { 
     boolean keepGoing = mScroller.computeScrollOffset(); 
     final int x = mScroller.getCurrX(); 
     final int y = mScroller.getCurrY(); 
     final int dx = x - mCapturedView.getLeft(); 
     final int dy = y - mCapturedView.getTop(); 

     if (dx != 0) { 
      ViewCompat.offsetLeftAndRight(mCapturedView, dx); 
     } 
     if (dy != 0) { 
      ViewCompat.offsetTopAndBottom(mCapturedView, dy); 
     } 

     if (dx != 0 || dy != 0) { 
      mCallback.onViewPositionChanged(mCapturedView, x, y, dx, dy); 
     } 

     if (keepGoing && x == mScroller.getFinalX() && y == mScroller.getFinalY()) { 
      // Close enough. The interpolator/scroller might think we're still moving 
      // but the user sure doesn't. 
      mScroller.abortAnimation(); 
      keepGoing = false; 
     } 

     if (!keepGoing) { 
      if (deferCallbacks) { 
       mParentView.post(mSetIdleRunnable); 
      } else { 
       setDragState(STATE_IDLE); 
      } 
     } 
    } 

    return mDragState == STATE_SETTLING; 
} 

它只是简单地以动画的纸张向上或向下根据所选择的目标状态所期望的位置。

伪问题代码是:

launchAnimation(); // it takes eg 300 ms 
changeVisibilityOfAnimatedViewChildren(); // this is problem 

我可以等到动画完成,但正如我所说,在HTTP请求的情况下,它是有点问题,我想最好刷新数据的时候了无需等待。

  • 动画元素是CoordinatorLayout。被setVisibility影响的孩子是一个或多个孩子。

  • 通过this link判断,android似乎在动画和setVisibility方面一般都有问题。也许

    • 如果我想改变的知名度与另一个平行postOnAnimation()任务

    • 还是因为它基本上只是:

    可能的解决方案我想到的是现在(?)一步一步调用移动函数mViewDragHelper.continueSettling()为什么不使用postOnAnimation()?我也可以在没有它的情况下运行任务。但我想那个postOnAnimation为混凝土设备选择一些正确的动画步骤延迟+可能还有其他一些事情。

+0

你能共享代码吗? –

+0

嗨,我编辑了代码 – luky

回答

0

您可以添加AnimatorListenerAdapter到父动画,并覆盖onAnimationEnd()方法。在这种方法中,您可以调用子动画。但是,我宁愿改变视角的阿尔法而不是视野。在这种情况下你可以达到更顺利的效果。

例如,考虑下面的代码:

parentAnimationInstance.addListener(new AnimatorListenerAdapter() { 
              @Override 
              public void onAnimationEnd(Animator animation) { 
               super.onAnimationEnd(animation); 
               childView.animate() 
                .alpha(1.f) 
                .setDuration(200) 
                .start(); 
              } 
             }); 
+0

嗨。是的,等到动画结束后才是解决方案之一。我想知道是否可以在视图动画的情况下与儿童可见度一起工作,但谢谢。 – luky

+0

您可以达到相同的效果。这很容易。 – nullbyte