2016-05-11 4 views
3

enter image description hereПеревести (кривая пути) + Масштаб анимации Android

Я хочу перевести ImageView в кривой при масштабировании как это переводится.

Ive прошли через несколько сообщений как https://stackoverflow.com/a/30254927/3518278 , где я не могу понять, как вычислить мой путь переменной

также его отметить здесь, что андроид 5 приведены основные кривые interpolars https://stackoverflow.com/a/26591870/3518278 , но они, кажется, нет эффекта.

Мой текущий код

View view; 
     ValueAnimator animator = ValueAnimator.ofFloat(0, 1); // values from 0 to 1 
     animator.setDuration(5000); // 5 seconds duration from 0 to 1 
     animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() 
     { 
      @Override 
      public void onAnimationUpdate(ValueAnimator animation) { 
       float value = ((Float) (animation.getAnimatedValue())) 
         .floatValue(); 
       // Set translation of your view here. Position can be calculated 
       // out of value. This code should move the view in a half circle. 
       img_fullscreen_drone.setTranslationX((float)(150.0 * Math.sin(value*Math.PI))); 
       img_fullscreen_drone.setTranslationY((float)(150.0 * Math.cos(value*Math.PI))); 
       img_fullscreen_drone.setScaleType(ImageView.ScaleType.CENTER); 
       img_fullscreen_drone.animate().scaleX(0.5f).scaleY(0.5f).setDuration(5000).start(); 

      } 
     }); 

     animator.start(); 

это переводит свой взгляд в дугу, но после перевода полной гаммы начинается, я хочу масштаба и перемещения вдоль кривой произойдет toghether.

Любая помощь будет appreicated

Заранее спасибо

ответ

4

Ваш исходный код перезапускал анимацию масштаба каждый кадр анимации, который переводил изображение. Вам просто нужно переместить код анимации шкалы из блока обновлений, как показано ниже.

Обратите внимание, что вы используете два несколько разных метода анимации, для масштабирования и перевода, что, возможно, вас смущает.

View view; 
    ValueAnimator animator = ValueAnimator.ofFloat(0, 1); // values from 0 to 1 
    animator.setDuration(5000); // 5 seconds duration from 0 to 1 
    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() 
    { 
     @Override 
     public void onAnimationUpdate(ValueAnimator animation) { 
      float value = ((Float) (animation.getAnimatedValue())) 
        .floatValue(); 
      // Set translation of your view here. Position can be calculated 
      // out of value. This code should move the view in a half circle. 
      img_fullscreen_drone.setTranslationX((float)(150.0 * Math.sin(value*Math.PI))); 
      img_fullscreen_drone.setTranslationY((float)(150.0 * Math.cos(value*Math.PI))); 
     } 
    }); 

    animator.start(); 

    img_fullscreen_drone.setScaleType(ImageView.ScaleType.CENTER); 
    img_fullscreen_drone.animate().scaleX(0.5f).scaleY(0.5f).setDuration(5000).start(); 
+0

Почему 150,0 ?????? – kemdo

+0

150 было произвольным значением, используемым оригинальным плакатом. –

-1

Сделать аниматора набор первым. Так что-то вроде

AnimatorSet set = new AnimatorSet(); 

Тогда вы должны отделить 2 анимации, который переводит и масштаб в виде мультипликатора, который вы можете сделать, как

для перевода использования:

ObjectAnimator translateAnimator = ObjectAnimator.ofInt(view, "y", toValue); 

же вы вы можете сделать для масштаба. Затем вы можете играть вместе

set.playTogether(translateAnimator, scaleAnimator); 

Это должно масштабироваться и переводиться вместе.

1

После возился с ответом Иоиля, я узнал, что вы могли бы также использовать ViewPropertyAnimator и записать все это сразу так:

img_fullscreen_drone.setScaleType(ImageView.ScaleType.CENTER); 
img_fullscreen_drone.animate() 
    .setUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
    @Override 
    public void onAnimationUpdate(ValueAnimator animation) { 
     float value = ((Float) (animation.getAnimatedValue())); 
     // Set translation of your view here. Position can be calculated 
     // out of value. This code should move the view in a half circle. 
     img_fullscreen_drone.setTranslationX((float)(150.0 * Math.sin(value*Math.PI))); 
     img_fullscreen_drone.setTranslationY((float)(150.0 * Math.cos(value*Math.PI))); 
    }}) 
    .scaleX(0f).scaleY(0f) 
    .setDuration(5000) 
    .start(); 

Не тестировался на я думаю, он должен работать нормально.

Смежные вопросы