Android: как поддерживать соотношение сторон в анимации

Анимация, которую я запускаю внутри образа, отказывается поддерживать пропорции кадров изображения. Следующие ответы в SO довольно информативны, но, похоже, не работают для меня: как масштабировать изображение в ImageView, чтобы сохранить соотношение сторон

Вот код:

private void startAnimation(){ mImageView.setAdjustViewBounds(true); mImageView.setScaleType(ScaleType.CENTER); mImageView.setBackgroundResource(R.anim.my_animation); AnimationDrawable frameAnimation = (AnimationDrawable) mImageView.getBackground(); // Start the animation (looped playback by default). frameAnimation.start(); } 

R.anim.my_animation – это просто список анимации:

 <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/selected" android:oneshot="false"> <item android:drawable="@drawable/photo_1" android:duration="100" /> <item android:drawable="@drawable/photo__2" android:duration="100" /> ... and so on... </animation-list> 

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

  private void startAnimation(){ mImageView.setAdjustViewBounds(true); mImageView.setScaleType(ScaleType.CENTER); mImageView.setImageDrawable(getResources().getDrawable(R.anim.my_animation)); AnimationDrawable frameAnimation = (AnimationDrawable) mImageView.getDrawable(); // Start the animation (looped playback by default). frameAnimation.start(); } 

Это немного сложно, но это работает. У меня две картинки в моем списке анимации

 <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/selected" android:oneshot="false"> <item android:drawable="@drawable/logo1" android:duration="5000" /> <item android:drawable="@drawable/logo2" android:duration="300" /> </animation-list> 

Затем я добавил третью картинку (logo0), которая имеет тот же размер, что и логотип1 / 2, но полностью прозрачна. Наконец, я использую этот ImageView:

 <ImageView android:id="@+id/imageViewLogo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:adjustViewBounds="true" android:layout_margin="5dp" android:src="@drawable/logo0" /> 

Теперь моя анимация сохраняет соотношение сторон моего изображения логотипа *.

Код:

  @Override public void onCreate(Bundle savedInstanceState) { ... imageView = (ImageView) findViewById(R.id.imageViewLogo); imageView.setBackgroundResource(R.drawable.logo_animation); ... public void onWindowFocusChanged (boolean hasFocus) { super.onWindowFocusChanged(hasFocus); AnimationDrawable frameAnimation = (AnimationDrawable) imageView.getBackground(); if(hasFocus) { frameAnimation.start(); } else { frameAnimation.stop(); } } 

Это очень просто, и вам нужны только дополнительные фиктивные фотографии для ваших ресурсов: никакого дополнительного кода, никаких сложных вычислений.

Intereting Posts
Почему этот оператор if пропускается? Как выбрать фрагмент Как определить, какой файл MP3 закончился в MediaPlayer.OnCompletionListener? Handler.sendMessageDelayed (msg, delay) работает неправильно Как удалить разрешение, добавленное из-за Google Fitness API 7.5.0 Как заставить PagerAdapter загружать все страницы Получить целенаправленный вид из ViewPager Установленное соединение было прервано программным обеспечением вашей хост-машины Android не может получить доступ к localhost? Стандартный метод кэширования данных в Android? Проблема с настройкой яркости на некоторых устройствах Android Как повернуть четыре спрайта в фокус этих спрайтов Как получить элементы (findViewById) для макета, который динамически загружается (setView) в диалоговом окне? Есть ли способ получить использование процессора приложений с Android 7 (нуга) При добавлении Facebook SDK «affventslogger.activateapp (this)» отображается устаревшим