Я делаю приложение для Android, и я новичок в разработке.

Я создал анимацию запуска для приложения, используя значок приложения, который масштабируется от размера O% до размера 100% и одновременно вращается. Это работает нормально. Но у меня с этим проблема. В xml видимость вида изначально отключена. В коде я вызываю image.setVisibility(View.VISIBLE), а затем image.startAnimation(iconAnimation). Но в результате я могу видеть вспышку ImageView до того, как он начнет анимацию, примерно на полсекунды или около того. Вы можете увидеть гифку.

Gif: см. гифку

Можете ли вы помочь мне с этим? Заранее спасибо.

Мой код:

runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    // here 
                    image.setVisibility(View.VISIBLE);
                    image.startAnimation(imageAnim);
                    //also found this somewhere, didn't help.
                    image.invalidate();
                }
            });

Макет xml:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="35sp"
    android:text="Kytky"
    android:layout_centerInParent="true"
    android:id="@+id/welcome_text"
    android:visibility="gone"/>
<ImageView
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:src="@mipmap/ic_launcher"
    android:layout_centerInParent="true"
    android:id="@+id/welcome_image"
    android:visibility="gone"/>
0
František Hlinka 6 Сен 2016 в 18:33

3 ответа

Лучший ответ

Вместо этого можно использовать аниматор значений, можно взломать анимацию

    imageView.setPivotX(viewCenterX);
    imageView.setPivotY(viewCenterY);
    imageView.setScaleX(0);
    imageView.setScaleY(0);

    final FloatEvaluator scaleEvaluator = new FloatEvaluator();
    final FloatEvaluator rotationEvaluator = new FloatEvaluator();
    ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1f);
    valueAnimator.setDuration(TimeUnit.SECONDS.toMillis(1));
    valueAnimator.setInterpolator(new DecelerateInterpolator());
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            float fraction = animation.getAnimatedFraction();
            float scale = scaleEvaluator.evaluate(fraction, 0f, 1f);
            float rotation = rotationEvaluator.evaluate(fraction, 0f, 360f);
            imageView.setScale(scale);
            imageView.setRotation(rotation);
        }
    });
    valueAnimator.start();

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

1
Sujith Niraikulathan 6 Сен 2016 в 15:51

Вы можете переключать видимость вида при запуске анимации

imageAnim.setAnimationListener(new Animation.AnimationListener() {
      @Override
      public void onAnimationStart(Animation animation) {
        image.setVisibility(View.VISIBLE);
      }

      @Override
      public void onAnimationEnd(Animation animation) {

      }

      @Override
      public void onAnimationRepeat(Animation animation) {

      }
    });

    image.startAnimation(imageAnim);

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

1
Mohammad Ersan 6 Сен 2016 в 15:38

Вам также нужно работать с альфой ... сделайте его видимым и установите альфа на минимальное значение, чем постепенно установите альфа на максимальное значение с помощью обработчика in.

0
Dharmaraj 6 Сен 2016 в 15:39