4

我想创建一个动态图像视图,其中我画廊中的每个图像都将使用 bitmapfactory 而不是绑定在图像视图中的图像可绘制。是否有一些网站有这方面的 bitmapfactory 教程?我相信使用 bitmapfactory 将图像绑定到图像视图中使用更少的内存?这是正确的吗?我还想尽量减少内存泄漏的风险,这就是我想使用 bitmapfactory 的原因。请帮忙。我找不到教授位图工厂的基本示例。

4

1 回答 1

20

构建位图对象

1)从文件

使用带有 push 选项的 adb 工具将 test2.png 复制到 sdcard

这是从 sdcard 加载位图的最简单方法。只需将图像的路径传递给 BitmapFactory.decodeFile() 并让 Android SDK 完成剩下的工作。

public class TestImages extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ImageView image = (ImageView) findViewById(R.id.test_image);
        Bitmap bMap = BitmapFactory.decodeFile("/sdcard/test2.png");
        image.setImageBitmap(bMap);
    }
}

这段代码所做的只是加载我们之前复制到 sdcard 的图像 test2.png。BitmapFactory 使用此图像创建一个位图对象,我们使用该ImageView.setImageBitmap()方法更新 ImageView 组件。

2)从输入流

用于BitmapFactory.decodeStream()将 BufferedInputStream 转换为位图对象。

public class TestImages extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ImageView image = (ImageView) findViewById(R.id.test_image);
        FileInputStream in;
        BufferedInputStream buf;
        try {
            in = new FileInputStream("/sdcard/test2.png");
            buf = new BufferedInputStream(in);
            Bitmap bMap = BitmapFactory.decodeStream(buf);
            image.setImageBitmap(bMap);
            if (in != null) {
            in.close();
            }
            if (buf != null) {
            buf.close();
            }
        } catch (Exception e) {
            Log.e("Error reading file", e.toString());
        }
    }
}

此代码使用基本的 Java FileInputStream 和 BufferedInputStream 为BitmapFactory.decodeStream(). 文件访问代码应该被一个 try/catch 块包围,以捕获 FileInputStream 或 BufferedInputStream 抛出的任何异常。此外,当您完成流句柄时,它们应该被关闭。

3)来自您的 Android 项目的资源

用于BitmapFactory.decodeResource(res, id)从 Android 资源中获取位图。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    ImageView image = (ImageView) findViewById(R.id.test_image);
    Bitmap bMap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
    image.setImageBitmap(bMap);
}
于 2012-06-25T02:27:38.387 回答