Android - 为视图设置动画并更改其实际位置(另一个视图遵循行为依赖性)

时间:2017-02-23 14:24:08

标签: android animation view behavior viewdraghelper

我试图使用ViewDragHelper动画我的appBar,当我向下拖动它时,它应该启动一个动画然后停下来。

在顶部,我有另一个视图(粉红色在the example),"关注"我的appbar有一个行为(顶视图取决于AppBarLayout)。

As you can see here appbar是动画的,但"真实"位置不会改变,显然,我的顶部框架不会移动。

为了动画,我使用以下代码:

@Override
public void onViewReleased(final View releasedChild, float xvel, float yvel) {
    super.onViewReleased(releasedChild, xvel, yvel);
    if (releasedChild.getTop() > childHeight) {
        Log.e("TAG", "SHOULD SCROLL " + releasedChild.getTop() + " > " + childHeight);
        final int offset = height - releasedChild.getTop() - 100;
        ViewCompat.animate(releasedChild).translationY(offset).setDuration(1000).setInterpolator(new OvershootInterpolator()).start();
    } else {
        Log.e("TAG", "SHOULD NOT SCROLL " + releasedChild.getTop() + " < " + childHeight);
        eleasedChild.offsetTopAndBottom(-releasedChild.getTop());
    }
    if (mDragFrameLayoutController != null) {
         mDragFrameLayoutController.onDragDrop(false);
    }
}

我已尝试过许多其他动画:

TranslateAnimation scale = new TranslateAnimation(0.0f, 0.0f, 0.f, offset);
scale.setInterpolator(new OvershootInterpolator());
scale.setDuration(3000L);
scale.setFillEnabled(true);
scale.setFillAfter(true);
scale.setAnimationListener(new Animation.AnimationListener() {

ObjectAnimator moveY = ObjectAnimator.ofInt(releasedChild, "y", releasedChild.getTop(), offset);
AnimatorSet as = new AnimatorSet();
as.play(moveY);
as.start();

所有这些片段都给我相同的结果。

我发现移动视图的唯一方法是使用偏移但这不会动画,它只是向下移动......

releasedChild.offsetTopAndBottom(offset);

有什么想法吗?感谢。

1 个答案:

答案 0 :(得分:0)

我终于找到了解决方案:

在我的viewDragHelper上我覆盖了以下方法:

(B) ItemReader

然后在我的自定义视图中,我覆盖了以下方法:

        @Override
        public int getViewVerticalDragRange(View child) {
            return getMeasuredHeight() - child.getMeasuredHeight();
        }


        @Override
        public void onViewReleased(View releasedChild, float xvel, float yvel) {
            super.onViewReleased(releasedChild, xvel, yvel);
            if(yvel>0) {
                mDragHelper.settleCapturedViewAt(releasedChild.getLeft(), getMeasuredHeight()-releasedChild.getMeasuredHeight());
            } else {
                mDragHelper.settleCapturedViewAt(releasedChild.getLeft(), 0);
            }
            invalidate();
        }

一切正常! 我希望这可以在将来帮助某人。