2017-02-23 5 views
0

ViewDragHelper를 사용하여 appBar에 애니메이션을 적용하려고하는데 애니메이션을 시작하고 아래로 드래그해야합니다.Android -보기 애니메이션 및 실제 위치 변경 (그리고 다른보기는 동작 종속성을 따릅니다.)

맨 위에 또 다른보기 (핑크 in 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(); 

이 모든 조각이 날 줄 내가 다음 코드를 사용하여 애니메이션을하기 위해

동일한 결과.

I 오프셋을 사용하는 뷰를 이동 찾았지만이 그냥 아래로 이동, 애니메이션하지 않는 유일한 방법 ...

releasedChild.offsetTopAndBottom(offset); 

어떤 생각? 감사.

내 viewDragHelper에 나는 다음과 같은 방법을 오버라이드 :

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

나는 다음과 같은 방법을 오버라이드

답변

0

나는 마침내 해결책을 발견 잘 작동! 나는이 미래에 다른 사람을 도울 수 있기를 바랍니다.