Android将一组位图合并为一个位图

时间:2015-11-02 05:29:26

标签: java android bitmap

我有一组Bitmaps,我想将它们合并为一个Bitmap,以便它们都以垂直格式显示。

理想情况下,它看起来像:

|Image1|
|Image2|
|Image3|
|  .   |  <--- a single Bitmap 
|  .   |
|  .   |

我看到一个问题建议使用CanvasBitmaps绘制在彼此之上,但我无法弄清楚如何根据我的问题格式化它。

我的Bitmaps在循环中生成如下:

for (int i = 0; i < bitmapSet.size(); i++) {
    Bitmap bitmap = bitmapSet.get(i);

    // Merging them together would go here
}

1 个答案:

答案 0 :(得分:1)

如果您想要在彼此之上显示多个图像,最简单的解决方案是使用LayerDrawable。您可以在代码或xml中创建LayerDrawable

1)在代码中创建LayerDrawable

如果要堆叠动态图像,则必须在代码中创建LayerDrawable。你可以这样做:

final LayerDrawable layerDrawable = new LayerDrawable(new Drawable[]{
        someDrawable,
        anotherDrawable,
        aThirdDrawable
});

Drawables的绘制顺序与数组中出现的顺序相同。创建LayerDrawable后,您可以像使用其他任何Drawable一样使用它,而LayerDrawable将会处理剩下的事情。

2)在XML中创建LayerDrawable

如果要将资源文件夹中包含的一些资源堆叠在一起,则只需在res / drawable文件夹中创建一个具有适当名称的新xml文件。定义LayerDrawable的工作原理如下:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/someDrawable"/>
    <item android:drawable="@drawable/anotherDrawable"/>
    <item android:drawable="@drawable/aThirdDrawableJustForGoodMeasure"/>

</layer-list>

对于您想要叠加的每个Drawable,您只需添加另一个<item />标记以及对Drawable的引用。同样,<layer-list />标记中的项目顺序决定了绘制顺序。

在您的特定情况下,由于您似乎有List Bitmaps,您可以像这样创建LayerDrawable

final List<Bitmap> images = ...;
final Drawable[] layers = new Drawable[images.size()];
for (int i = 0, count = images.size(); i < count; i++) {
    layers[i] = new BitmapDrawable(getResources(), images.get(i));
}
final LayerDrawable layerDrawable = new LayerDrawable(layers);

但是,如果你从一开始只使用Drawables就可以做得更好,在这种情况下代码可以简化为:

final List<Drawable> images = ...;
final LayerDrawable layerDrawable = new LayerDrawable(images.toArray(new Drawable[images.size()]));

您可以在official documentation中找到有关LayerDrawable的更多信息!