如何将XML布局资源保存到图像?

时间:2017-08-20 18:47:36

标签: android xml

我希望能够从我创建的布局xml中保存1000x1000 .png图像。我在网上找到了将已经显示的视图保存到.png文件中的人的样本,但是我找不到任何用于从当前未显示的布局创建图像的示例代码。我可以只保存屏幕上显示的内容,因为正在创建的图像非常相似,但我不希望布局/分辨率由设备大小/布局决定/取向;我希望图像始终在每台设备上保存相同。我对Android很新,我花了几个小时试图弄清楚如何做到这一点,但却找不到任何东西。这是saveable_image_layout.xml的xml代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="1000px"
    android:layout_height="1000px"
    android:id="@+id/sil_main">
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="500px">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/sil_quote_text"
            android:layout_gravity="start|bottom"
            android:textSize="30sp"
            android:fontFamily="sans-serif-condensed"
            android:text="Sample text 1"/>
    </FrameLayout>

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="500px">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/sil_person_text"
            android:layout_gravity="end"
            android:textSize="24sp"
            android:fontFamily="sans-serif-thin"
            android:text="Sample text 2"/>
    </FrameLayout>

</LinearLayout>

我尝试将其保存为这样的图像:

LayoutInflater inflater = LayoutInflater.from(getApplicationContext());
View view = inflater.inflate(R.layout.saveable_image_layout, null);
LinearLayout layout = view.findViewById(R.id.sil_main);

Bitmap bitmap = layout.getDrawingCache();
Canvas canvas = new Canvas(bitmap);
layout.draw(canvas);

try {
    File file = new File(Environment.getExternalStorageDirectory(), "img-" + System.currentTimeMillis() + ".png");

    Log.v(LOG_TAG, file.toString());

    FileOutputStream out = new FileOutputStream(file);
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);

    out.flush();
    out.close();
} catch (IOException e) {
    e.printStackTrace();
}

但我最终得到了错误,

java.lang.NullPointerException:尝试调用虚方法&#39; boolean android.graphics.Bitmap.isMutable()&#39;在空对象引用上

所以我猜测inflater.inflate()调用返回null,但我不确定原因。我错了吗?我有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

我认为你没有启用绘图缓存尝试在调用getDrawingCache()

之前添加以下代码
    layout.setDrawingCacheEnabled(true);
    // this is the important code :)
    // Without it the view will have a dimension of 0,0 and the bitmap will be null
    layout.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
        MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 

    layout.layout(0, 0, layout.getMeasuredWidth(), layout.getMeasuredHeight());
    layout.buildDrawingCache(true);
希望有所帮助。