Guardar vista como mapa de bits, sólo obtener pantalla en negro

Tengo una aplicación de dibujo y tengo métodos para guardar imágenes dibujadas. Pero sólo obtengo una imagen de mapa de bits en negro con el botón Guardar. Dónde está el problema ?

Hay mi 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" /> 

Y mi actividad principal:

 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()); } 

Método para guardar

  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()); } } 

Mi problema, estaba resuelto, pero tengo un pequeño detalle. Mi aplicación bajar, cuando cambio mi xml. a esto.

 <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" /> 

En realidad, estás pasando la vista (v) de tu botón btn6 en el método save(v) – Pasa el objeto de disposición lineal que es mcontent o mView , entonces eso sería save(mContent) , Esto resolverá tu problema

Usted puede intentar este método también-

Pase su diseño o vista padre en method-

  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; } 

Intente esto: – encuentre su opinión de padre

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

– Y llamar a 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; } 

Puede utilizar View.getDrawingCache ()

Antes de que se debe llamar View.setDrawingCache (true) ;

He creado un componente del cutom que extiende GroupView y utilizó este método para ahorrar esta disposición a un mapa de bits.

  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; } 

Espero que te ayude. Si desea guardar su diseño, debe cambiarlo con el diseño completo que desea guardar

  • Android: Detecta el teclado virtual abierto
  • Android: mapa de bits de una vista de gran tamaño
  • Margen de visión establecido para Android por programación
  • Cómo ver un Google Calendar público a través de una aplicación para Android
  • Android - Vista de búsqueda: Sugerencia de consulta visible
  • Android dibuja usando SurfaceView y el hilo
  • Cambiar el tamaño del texto del elemento en la vista de navegación
  • Método recomendado para presentar texto con formato en Android?
  • Se debe hacer clic en SearchView dos veces para abrir
  • ¿Puedo agregar vistas a una vista de desplazamiento sin inflar / volver a inflar los diseños?
  • Android, agregue una nueva vista sin diseño XML
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.