1

我正在使用近 150 个图像帧创建一个逐帧动画的应用程序。通过使用 Handler 更改 Image 视图的背景图像来播放动画。在处理程序中,我从文件夹 /mnt/sdcard/Android/data/ApplicationPackage 中检索图像,并通过以下方式将其动态更改为图像视图背景:

FileInputStream in;                       
in = new FileInputStream(mFrames.get(imgpos));                              
bitmap  = BitmapFactory.decodeStream(in); 
if (in != null)
{   
    in.close();
}

这会在解码文件输入流时产生一些问题,因为某些图像需要很长时间才能创建位图。每个图像的图像文件大小几乎小于 40 KB,但是对于相同大小的文件,从外部目录解码图像所需的时间不同。我试图对文件大小和加载进行采样,但它直接影响图像清晰度。谁能建议我将图像从外部文件夹加载到位图并且所有图像的持续时间相同的更好方法是什么?

谢谢,蒂姆

4

2 回答 2

0

我认为您必须在显示它们之前预加载位图......使用位图数组和一个后台任务,在进入您的活动时加载所有图像。您的处理程序绝对不允许执行耗时的任务,例如加载位图!

于 2012-08-27T10:22:48.123 回答
0

您可以在为它们创建位图之前缩小图像。

public Bitmap decodeSampledBitmapFromPath(String path) 
{
    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(path, options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, requiredWidth, requiredHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    Bitmap newBmap = BitmapFactory.decodeFile(path, options);

    return newBmap;
}

public int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) 
{
    int inSampleSize = 1;

    if (imageHeight > reqHeight || imageWidth > reqWidth) 
    {
        if (imageWidth > imageHeight) 
        {
            inSampleSize = Math.round((float)imageHeight / (float)reqHeight);
        } 
        else 
        {
            inSampleSize = Math.round((float)imageWidth / (float)reqWidth);
        }
    }
    return inSampleSize;
}

如果图像比加载它们的视图大很多,那么这种缩小确实有助于更快地创建位图。此外,与直接创建位图相比,缩放Bitmap占用的内存要少得多。
inJustDecodeBoundsBitmapFactory.Options设置true为时,您可以在为其创建之前获取高度和宽度Bitmap。因此,您可以检查图像是否大于要求。如果是,则将它们缩放到所需的高度和宽度,然后创建其Bitmap.

希望这可以帮助!

于 2012-08-27T10:42:56.330 回答