2017-02-23 3 views
0

ViewDragHelperを使用してappBarをアニメーション化しようとしています。Android - ビューをアニメーション化して実際の位置を変更する(別のビューはビヘイビアの依存関係に従う)

上に、別のビュー(ピンクはthe example)があります。これは、私のAppbarに動作に従う(トップビューはAppBarLayoutに依存します)。

「実際」の位置は変更されず、明らかにトップフレームは動きません。私は他の多くのアニメーションを試してみた

@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

私は最終的に解決策が見つかりました:

@Override 
    public void computeScroll() { 
     super.computeScroll(); 
     if (mDragHelper.continueSettling(true)) { 
      ViewCompat.postInvalidateOnAnimation(this); 
     } 
    } 

、すべて:私は次のメソッドをオーバーライド私のカスタムビューに、その後

 @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(); 
     } 

:私は次のメソッドをオーバーライド私のviewDragHelperに

をうまくいった! これは将来的に誰かを助けることができれば幸いです。

関連する問題