Android: быстрое изменение изображений (например, анимация)

1

Я хочу быстро разбить 10 различных изображений, когда я перетаскиваю палец на экран. Изображения сохраняются в SD-карте. Я использую этот код для отображения изображений на экране, но изменение происходит слишком медленно.

public class ImageActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    image = (ImageView) findViewById(R.id.image);

    File images = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); 
    File[] imagelist = images.listFiles(new FilenameFilter(){ 
        public boolean accept(File dir, String name) { 
            return ((name.endsWith(".jpg"))||(name.endsWith(".png"))); 
        } 
    }); 
    mFiles = new String[imagelist.length]; 
    for(int i= 0 ; i< imagelist.length; i++) { 
        mFiles[i] = imagelist[i].toString();
    } 
    getImageFromSDCard();
}

public void getImageFromSDCard() {
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 8;
    try {
        if(mFilePosition < mFiles.length) {
            Log.d("", mFiles[mFilePosition]);
            Bitmap b = BitmapFactory.decodeFile(mFiles[mFilePosition], null);
            image.setImageBitmap(b);
            mFilePosition = 0;
        }

    } catch (Exception e) {
       //Log error
    }
    b = null;
    System.gc();
}

@Override
public boolean onTouchEvent(MotionEvent event) {

    if (event.getAction() == MotionEvent.ACTION_MOVE) {
        getImageFromSDCard();
    } 
}}

В основном я пытаюсь сделать что-то вроде анимации. Итак, как сделать загрузку изображений быстрее?

Теги:
image

1 ответ

1

Вы можете дождаться завершения загрузки и отобразить только изображения на изображении. Для этого удалите оператор image.setImageBitmap(b); из цикла for и создать массивList растровых изображений для хранения изображений. Таким образом, вы можете гарантировать, что изображения загружены до того, как вы хотите их отображать.

попробуйте следующее:

public class Pics extends Activity {
private ImageView image;
private String[] mFiles;
private int mFilePosition = 0;
private ArrayList<Bitmap> bitArray;
private Bitmap b;
private int i;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    image = (ImageView) findViewById(R.id.image);
    bitArray = new ArrayList<Bitmap>();
    File images = Environment
            .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
    try {
        images.createNewFile();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    Log.e("file path", images.getAbsolutePath());
    File[] imagelist = images.listFiles(new FilenameFilter() {
        public boolean accept(File dir, String name) {
            return ((name.endsWith(".jpg")) || (name.endsWith(".png")));
        }
    });
    mFiles = new String[imagelist.length];
    Log.e("size", imagelist.length + "");
    for (int i = 0; i < imagelist.length; i++) {
        mFiles[i] = imagelist[i].toString();
    }
    getImageFromSDCard();
}

public void getImageFromSDCard() {

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 8;
    try {
        for (int j = 0; j < mFiles.length; j++) {
            Log.d("", mFiles[mFilePosition]);
            b = BitmapFactory.decodeFile(mFiles[j], null);
            bitArray.add(b);
        }

    } catch (Exception e) {
        // Log error
    }
    b = null;
    System.gc();
}

@Override
public boolean onTouchEvent(MotionEvent event) {

    if (event.getAction() == MotionEvent.ACTION_MOVE) {
        MathHelper.showToast(getApplicationContext(), bitArray.size() + "");

        for (i = 0; i < bitArray.size()-1; i++) {
            new Handler().postDelayed(new Runnable() {

                @Override
                public void run() { // TODO Auto-generated method stub
                    image.setImageBitmap(bitArray.get(i));
                }
            }, 1000);
        }

    }
    return true;
}

}

  • 1
    Благодарю. это, кажется, не работает, хотя. Показывается только одно изображение. и как мне обойти bitmap exceeds VM budget ? я получаю сообщение об ошибке, когда в каталоге более 3 изображений

Ещё вопросы

Сообщество Overcoder
Наверх
Меню