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
- Android - vistas de servicio
- Butterknife vs AndroidAnnotations
- ¿Cómo usar la aleta de vista con tres diseños?
- Android: cómo determinar la última letra totalmente visible en TextView?
- Cambiar el color del cursor de searchView
<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" />
- Android: View.setID (int id) de forma programática - ¿cómo evitar conflictos de ID?
- ¿Cómo podemos agregar maxlength en SearchView?
- Efecto del carrusel de Android con diseños
- El niño especificado ya tiene un padre
- GridView getChildAt () devuelve null
- Iterar a través de vistas en un diseño y cambiar la tipografía
- ¿Corrección de Android EditText para el texto?
- Android View con View.GONE sigue recibiendo onTouch y onClick
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