我需要创建一个自定义视图,然后将其保存到png文件到sdcard。现在我在SD卡中获得黑色图像。我无法在代码中找出问题所在。任何人都可以帮助我。
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:orientation="vertical" >
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/black" />
<TextView
android:id="@+id/address"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/black" />
</LinearLyout>
在我的java文件中,我夸大了线性布局并将数据设置为textviews然后我正在调用:
private Bitmap convertViewToBitmap(LinearLayout layout) {
layout.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
int width = layout.getMeasuredWidth();
int height = layout.getMeasuredHeight();
//Create the bitmap
Bitmap bitmap = Bitmap.createBitmap(width,
height,
Bitmap.Config.ARGB_8888);
//Create a canvas with the specified bitmap to draw into
Canvas c = new Canvas(bitmap);
//Render this view (and all of its children) to the given Canvas
view.draw(c);
return bitmap;
}
获取位图后,我将其保存到SD卡,如下所示:
private void saveBitmapTpSdCard(Bitmap bitmap, String fileName) {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 40, bytes);
File f = new File(Environment.getExternalStorageDirectory()
+ File.separator + getString(R.string.app_name));
try {
if(!f.exists()) {
f.mkdirs();
}
File imageFile = new File(f, fileName + ".png");
FileOutputStream fo = new FileOutputStream(imageFile);
fo.write(bytes.toByteArray());
fo.close();
} catch (IOException e) {
e.printStackTrace();
}
}
答案 0 :(得分:3)
我通过添加这一行来实现它:
view.layout(0, 0, width, height);
在使用Bitmap.createBitmap创建位图之前
答案 1 :(得分:0)
尝试以下代码将自定义视图转换为位图对象:
LinearLayout layout = (LinearLayout) findViewById(R.id.layout_main_for_bitmap);
layout.setDrawingCacheEnabled(true);
layout.buildDrawingCache();
Bitmap bitmap = layout.getDrawingCache();
答案 2 :(得分:0)
LinearLayout
由您手动测量的事实并不意味着它已被布局(即未调用layout
)。因此,孩子们没有得到布局,因此他们在ViewGroup
上没有得到正确的位置,因此他们看不到。
我建议你不要试图模仿绘图生命周期,而是建议在linearLayout.post()
上调用LinearLayout
(如果它被添加到视图层次结构中),而Runnable
内部调用你的“捕捉” “工作流程。
或者,您可以手动调用layout
。