Android: как сохранить пропорции в анимации - PullRequest
8 голосов
/ 16 мая 2011

Анимация, которую я запускаю в просмотре изображений, не поддерживает соотношение сторон кадров изображений. Следующие ответы в 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>

Ответы [ 2 ]

10 голосов
/ 24 декабря 2013

Вместо настройки анимации, которую можно нарисовать на фоне изображения, установите ее на переднем плане, используя 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();
}
0 голосов
/ 12 марта 2013

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

<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) того же размера, что и logo1 / 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(); }
    }

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

...