我有一个绘图应用程序,并且有一些保存绘制图片的方法。但是我只用保存按钮得到了一张黑色的位图图片。问题出在哪里 ?
有我的XML
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/all" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/black" tools:context=".Circle" > <org.vkedco.mobappdev.draw_touch_drive_00001.krouzky android:id="@+id/pntr" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:tag="Painter" /> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView3" android:layout_below="@+id/button4" android:layout_marginTop="50dp" android:text="value" android:textColor="@color/white" /> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_toRightOf="@+id/button2" android:text="Add" /> <Button android:id="@+id/button4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:text="Delete" /> <Button android:id="@+id/button6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:text="Save" android:layout_marginTop="45dp" android:layout_alignLeft="@+id/button3" /> <Button android:id="@+id/button5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:text="Clear" android:layout_marginTop="45dp" android:layout_alignRight="@+id/button3" /> <LinearLayout android:orientation="vertical" android:layout_height="match_parent" android:id="@+id/linearLayout" android:layout_width="match_parent" />
而我的主要活动:
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时,我的应用程序崩溃了。为此。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/rl" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/black" tools:context=".Circle" > <org.vkedco.mobappdev.draw_touch_drive_00001.krouzky android:id="@+id/pntr" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:tag="Painter" /> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_toRightOf="@+id/button2" android:text="Add" /> <Button android:id="@+id/button4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:text="Delete" /> <Button android:id="@+id/button6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:text="Save" android:layout_marginTop="45dp" android:layout_alignLeft="@+id/button3" /> <Button android:id="@+id/button5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:text="Clear" android:layout_marginTop="45dp" android:layout_alignRight="@+id/button3" /> <LinearLayout android:orientation="vertical" android:layout_height="match_parent" android:id="@+id/linearLayout" android:layout_width="match_parent" > </LinearLayout> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/button6" android:layout_marginTop="21dp" android:text="value" android:textColor="@color/blue" />
实际上,您正在通过方法传递 Button btn6 的视图(v) save(v)-通过是mcontent或的线性布局对象mView,那么它将是save(mContent),这将解决您的问题
save(v)
mcontent
mView
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; }