我希望能够从我创建的布局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,但我不确定原因。我错了吗?我有更好的方法吗?
答案 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);
希望有所帮助。