像位图一样保存视图,我只得到黑屏

我有一个绘图应用程序,我有保存图片的方法。 但我只使用保存按钮获得黑色位图图片。 问题出在哪儿 ?

有我的xml

   

而我的主要活动:

 public class aktivita extends Activity{ Button btn; public LinearLayout mContent; krouzky mTicTacToeView = null; public static String tempDir; public File mypath; public static Bitmap mBitmap; public static int width; public static int height; public static float x; public static float y; public static float X; public static float Y; public static double vzdalenost; public String current = null; private String uniqueId; public krouzky mSignature; public View mView; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.zaznam_ran); krouzky.t = 0; File directory = new File(Environment.getExternalStorageDirectory() + "/Images"); if(!directory.exists()) directory.mkdir(); uniqueId = getTodaysDate() + "_" + getCurrentTime(); current = uniqueId + ".png"; mypath= new File(directory,current); mContent = (LinearLayout) findViewById(R.id.linearLayout); mSignature = new krouzky(this, null); mSignature.setBackgroundColor(Color.TRANSPARENT); mContent.addView(mSignature, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); mView = mContent; Display display = getWindowManager().getDefaultDisplay(); width = (display.getWidth()); height = (display.getHeight()); mTicTacToeView = (krouzky) this.findViewById(R.id.pntr); Button btn6 = (Button) findViewById(R.id.button6); btn6.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.v("log_tag", "Panel Saved"); mView.setDrawingCacheEnabled(true); save(v); } }); } private boolean prepareDirectory() { try { if (makedirs()) { return true; } else { return false; } } catch (Exception e) { e.printStackTrace(); Toast.makeText(this, "Could not initiate File System.. Is Sdcard mounted properly?", 1000).show(); return false; } } private boolean makedirs() { File tempdir = new File(tempDir); if (!tempdir.exists()) tempdir.mkdirs(); if (tempdir.isDirectory()) { File[] files = tempdir.listFiles(); for (File file : files) { if (!file.delete()) { System.out.println("Failed to delete " + file); } } } return (tempdir.isDirectory()); } 

保存方法

  public void save(View v) { Log.v("log_tag", "Width: " + v.getWidth()); Log.v("log_tag", "Height: " + v.getHeight()); if(mBitmap == null) { mBitmap = Bitmap.createBitmap (width, height, Bitmap.Config.RGB_565); } Canvas canvas = new Canvas(mBitmap); try { FileOutputStream mFileOutStream = new FileOutputStream(mypath); v.draw(canvas); mBitmap.compress(Bitmap.CompressFormat.PNG, 90, mFileOutStream); mFileOutStream.flush(); mFileOutStream.close(); } catch(Exception e) { Log.v("log_tag", e.toString()); } } 

我的问题已经解决,但我有一个小细节。 当我更改我的xml时,我的应用程序停止了。 对此。

   

实际上你正在通过方法save(v)传递你的Button btn6的视图(v) – 传递mcontentmView线性布局对象,那就是save(mContent) ,这将解决你的问题

您也可以尝试这种方法 –

在方法中传递您的父布局或视图 –

  Bitmap file = save(mcontent); Bitmap save(View v) { Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888); Canvas c = new Canvas(b); v.draw(c); return b; } 

试试这个: – 找到你的父视图

 RelativeLayout holder = (RelativeLayout) findViewById(R.id.all); 

– 并调用loadBitmapFromView(holder)

 public static Bitmap loadBitmapFromView(View v) { DisplayMetrics dm = getResources().getDisplayMetrics(); v.measure(MeasureSpec.makeMeasureSpec(dm.widthPixels, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(dm.heightPixels, MeasureSpec.EXACTLY)); v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight()); ((RelativeLayout) v).setGravity(Gravity.CENTER); Bitmap returnedBitmap = Bitmap.createBitmap(v.getMeasuredWidth(), v.getMeasuredHeight(), Bitmap.Config.ARGB_8888); Canvas c = new Canvas(returnedBitmap); v.draw(c); return returnedBitmap; } 

你可以使用View.getDrawingCache()

在它之前你应该调用View.setDrawingCache(true) ;

我创建了一个扩展GroupView的cutom组件,并使用此方法将此布局保存到位图。

  public Bitmap createBitmap() { //Log.d("Pin", "Image W ["+this.getWidth()+"] x H ["+this.getHeight()+"]"); Bitmap b = Bitmap.createBitmap(this.getWidth(), this.getHeight(), Bitmap.Config.RGB_565); Canvas c = new Canvas(b); this.draw(c); return b; } 

希望它能帮到你。 如果要保存布局,则应使用要保存的整个布局更改此布局