Как создать последовательность анимации ImageView из доступных ресурсов?

Я пытаюсь загрузить 11 изображений из доступных для рисования ресурсов и отобразить их в ImageView с задержкой. Практически делать что-то вроде AnimationDrawable, поскольку создание таких результатов приводит к исключению OutOfMemory и сбою. Это и изобретение велосипеда, и некоторая практика, но все равно вызывает сбой приложения. Если я просто запускаю imgView и делаю imgView.setImageResource(R.drawable.pic1);, изображение загружается. Когда я устанавливаю обработчик и пытаюсь выполнить postDelayed(), как показано ниже, я просто вижу фоновое изображение макета до того, как приложение вылетает без ничего в Logcat. Вот код:

package com.forms.test;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;

public class Animacia extends Activity {

final static int[] imgGalleryResources = { 
    R.drawable.pic1, R.drawable.pic2, R.drawable.pic3,
    R.drawable.pic4, R.drawable.pic5, R.drawable.pic6,
    R.drawable.pic7, R.drawable.pic8, R.drawable.pic9,
    R.drawable.pic10, R.drawable.pic11
};

ImageView imgView;
Handler   handlerTimer = new Handler();

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.animation);

    initGUI();
}

private void initGUI() {
    int i;
    imgView = (ImageView)findViewById(R.id.imgView);
    imgView.setAnimation(AnimationUtils.loadAnimation(this, R.anim.alpha));

    for(i = 0; i < imgGalleryResources.length ;i++) {
        final int res = imgGalleryResources[i];
        handlerTimer.postDelayed(
                new Runnable() {
                    public void run() {
                        imgView.setImageResource(res);
                    }
                }, 
                5000
        );
    }
}
}

С этим кодом связан imgView из layout/animation.xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical" 
   android:layout_width="fill_parent" 
   android:layout_height="fill_parent"
   android:background="@drawable/heart"
   android:id="@+id/frameLayout1">

   <ImageView
       android:id="@+id/imgView"  
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" />

</FrameLayout>

И альфа-анимация imgView из anim/alpha.xml:

<?xml version="1.0" encoding="utf-8"?>
<alpha>
    <alpha
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromAlpha="0.3"
android:toAlpha="0.9"
android:duration="2000" />
</alpha>

Все советы и комментарии приветствуются.


person freemind    schedule 20.02.2013    source источник
comment
Возможно, это может быть полезно stackoverflow.com/questions/5880559/   -  person Jacob    schedule 21.02.2013


Ответы (1)


Вы пробовали этот метод?

private int pos = 0;
private Timer timer;
private static final int UPDATE_PICTURE = 5;
private void initGUI() {
    imgView = (ImageView)findViewById(R.id.imgView);
    imgView.setAnimation(AnimationUtils.loadAnimation(this, R.anim.alpha));

    handlerTimer = new Handler() {
        public void handleMessage(Message msg) {
            if(msg.what == UPDATE_PICTURE)
            {
                 //start animation here
                imgView.setImageResource(msg.arg1);
                imgView.invalidate();
            }
        }
    };

    timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {

        public void run() {
            Message msg = new Message();
            msg.what = UPDATE_PICTURE;
            msg.arg1 = imgGalleryResources[pos++];
            handlerTimer.sendMessage(msg);
            if(pos>=imgGalleryResources.length)
                timer.cancel();
        }
    }, 0, 2000);

}
person julien dumortier    schedule 20.02.2013
comment
К сожалению, это также приводит к сбою ... Для ясности: я просто пытаюсь создать слайд-шоу изображений из нескольких рисунков с задержкой между ними и альфа-анимацией для постепенного появления следующего изображения. Вот об этом. Как правило, было бы неплохо иметь тот же эффект, что и setRepeatMode(Animation.RESTART); и setRepeatCount(Animation.INFINITE); чтобы снова начать с изображения 1 после отображения изображения 11, но это не должно быть проблемой, если я запущу его один раз :) - person freemind; 21.02.2013
comment
этот код работает со мной. И получаешь ошибку типа нехватка памяти, думаю проблема размера изображения. какое разрешение ваших фото? Вы пробовали с другим изображением (с меньшим разрешением)? - person julien dumortier; 21.02.2013
comment
Единственное загруженное изображение (R.drawable.pic1) имеет размеры W:680px H:453px. Все остальные намного выше этого. Я думал, что это может быть проблемой, но, с одной стороны, метод setImageResource() сам выполняет некоторое масштабирование изображений. Кроме того, я осмотрелся и реализовал 2 метода (не размещенных здесь), чтобы попытаться вручную изменить масштаб изображений и установить их в ImageView с помощью setImageBitmap(), но, вероятно, это неправильно, что я сделал, поскольку в каждом случае я получаю ошибки памяти. Каковы максимально возможные размеры для ЛАНДШАФТА/ПОРТРЕТА? Как другие инструменты выводят большие изображения? - person freemind; 21.02.2013