2017-06-09 7 views
0

Je voudrais animer en douceur certaines vues en position Y en fonction du fait que l'utilisateur fasse défiler une feuille du bas.vue animée translationY sur bottomsheet scroll

http://imgur.com/dVBlh83

Cependant l'animation est un peu saccadé.
Ceci est probablement dû au fait que le défilement d'une feuille de fond me donne un slideOffset à un certain intervalle, ce qui est trop peu fréquent pour setTranlationY comme je le fais actuellement.

Y a-t-il une meilleure façon de procéder?

rappel feuille inférieure

BottomSheetBehavior.BottomSheetCallback() { 

     @Override public void onSlide(@NonNull View bottomSheetView, float slideOffset) { 
      int offset = (int) (slideOffset * 100); 
      if (offset > 0) { 
       scrollingHeaderView.animate(offset); 
      } 
     } 
    }); 

scrollingHeaderView

public void animate(int offset) { 
    position = -(offset/2); 
    arrow.setTranslationY(offset * ANIMATION_RATIO_ARROW); 
    detailView.setTranslationY(offset * ANIMATION_RATIO); 
} 

J'ai essayé d'utiliser ObjectAnimator pour créer beaucoup de petites animations à chaque étape.

ObjectAnimator.ofFloat(arrow, "translationY", arrow.getTranslationY(), position * ANIMATION_RATIO_ARROW).start(); 

Répondre

0

au cas où cela aiderait quelqu'un d'autre. Je l'ai eu l'air beaucoup mieux.

D'abord, je fixe la ration par pixel * gamme de valeurs que je recevrais. Donc, décalage sera de 0 -> 100 Mutliplied par le dp je veux la vue de se déplacer

private static int ANIMATION_RANGE = 100; 
arrowScale = -(getResources().getDimensionPixelOffset(R.dimen.arrow_distance)/ANIMATION_RANGE); 
containerScale = -(getResources().getDimensionPixelOffset(R.dimen.detail_distance)/ANIMATION_RANGE); 

alors que les changements de valeur je ceci en utilisant TranslationY

arrow.setTranslationY(position * arrowScale); 
detailView.setTranslationY(position * containerScale); 

J'ai aussi besoin d'une méthode de remise à zéro, qui reviennent à la position d'origine

public void reset() { 
    arrow.animate().setDuration(100).translationY(0); 
    detailView.animate().setDuration(100).translationY(0); 
}