2017-02-23 3 views
0

J'essaye d'animer mon appBar en utilisant un ViewDragHelper, quand je le fais glisser vers le bas il devrait commencer une animation et descendre. En plus j'ai une autre vue (rose en the example) qui "suit" mon appbar avec un comportement (la vue de dessus dépend de AppBarLayout). L'appbar est animée mais la position "réelle" ne change pas et, évidemment, mon image supérieure ne bouge pas.Android - Animer une vue et changer sa position réelle (et une autre vue suivre avec dépendance au comportement)

Pour animer j'utiliser le code suivant:

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

J'ai essayé avec beaucoup d'autres animations:

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() { 

ou

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

Tous ces extraits me donnent le même résultat.

La seule manière que je trouvais pour déplacer la vue est en offset, mais cela n'anime pas, il se déplace juste en bas ...

releasedChild.offsetTopAndBottom(offset); 

Toute idée? Merci.

Répondre

0

J'ai finalement trouvé la solution:

sur mon viewDragHelper je l'emportaient sur les méthodes suivantes:

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

alors sur mon point de vue personnalisé Je l'emporterait sur la méthode suivante:

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

Et tout a bien fonctionné! J'espère que cela peut aider quelqu'un à l'avenir.