我试图使用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);
有什么想法吗?感谢。
答案 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();
}
一切正常! 我希望这可以在将来帮助某人。