2012-04-29 13 views
7

He probado el siguiente código para convertir el LinearLayout a la imagen:Cómo convertir un LinearLayout a la imagen?

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    LinearLayout lyt = (LinearLayout) findViewById(R.id.lyt); 
    lyt.setDrawingCacheEnabled(true); 
    lyt.buildDrawingCache(true); 

    Bitmap b = Bitmap.createBitmap(lyt.getDrawingCache()); 

    ImageView img = (ImageView) findViewById(R.id.imageView1); 
    img.setImageBitmap(b); 

} 

pero tiene NullPointerException en:

Bitmap b = Bitmap.createBitmap(lyt.getDrawingCache()); 

donde el XML diseño es:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 


    <LinearLayout 
     android:id="@+id/lyt" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" > 

     <Button 
      android:id="@+id/button1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Button 1" /> 

     <Button 
      android:id="@+id/button3" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Button 2" /> 

     <Button 
      android:id="@+id/button2" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Button 3" /> 

    </LinearLayout> 

    <ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/ic_launcher" /> 

</LinearLayout> 

Respuesta

8

Pruebe debajo de código, funciona

Añadir a continuación el permiso en el manifiesto

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

MainActivity.java

public class MainActivity extends Activity implements OnClickListener{ 
private LinearLayout linearLayout; 
private Button saveBtn; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    linearLayout = (LinearLayout) findViewById(R.id.linearLayout_view); 
    saveBtn = (Button) findViewById(R.id.save_btn); 
    saveBtn.setOnClickListener(this); 
} 

@Override 
public void onClick(View v) { 
    int id = v.getId(); 
    switch (id) { 
    case R.id.save_btn: 
     File file = saveBitMap(this, linearLayout); //which view you want to pass that view as parameter 
     if (file != null) { 
      Log.i("TAG", "Drawing saved to the gallery!"); 
     } else { 
      Log.i("TAG", "Oops! Image could not be saved."); 
     } 
     break; 
    default: 
     break; 
    } 

private File saveBitMap(Context context, View drawView){ 
    File pictureFileDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"Handcare"); 
    if (!pictureFileDir.exists()) { 
     boolean isDirectoryCreated = pictureFileDir.mkdirs(); 
     if(!isDirectoryCreated) 
      Log.i("ATG", "Can't create directory to save the image"); 
     return null; 
    } 
    String filename = pictureFileDir.getPath() +File.separator+ System.currentTimeMillis()+".jpg"; 
    File pictureFile = new File(filename); 
    Bitmap bitmap =getBitmapFromView(drawView); 
    try { 
     pictureFile.createNewFile(); 
     FileOutputStream oStream = new FileOutputStream(pictureFile); 
     bitmap.compress(CompressFormat.PNG, 100, oStream); 
     oStream.flush(); 
     oStream.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     Log.i("TAG", "There was an issue saving the image."); 
    }  
     scanGallery(context,pictureFile.getAbsolutePath()); 
    return pictureFile; 
} 
//create bitmap from view and returns it 
private Bitmap getBitmapFromView(View view) { 
    //Define a bitmap with the same size as the view 
    Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),Bitmap.Config.ARGB_8888); 
    //Bind a canvas to it 
    Canvas canvas = new Canvas(returnedBitmap); 
    //Get the view's background 
    Drawable bgDrawable =view.getBackground(); 
    if (bgDrawable!=null) { 
     //has background drawable, then draw it on the canvas 
     bgDrawable.draw(canvas); 
    } else{ 
     //does not have background drawable, then draw white background on the canvas 
     canvas.drawColor(Color.WHITE); 
    } 
    // draw the view on the canvas 
    view.draw(canvas); 
    //return the bitmap 
    return returnedBitmap; 
} 
// used for scanning gallery 
private void scanGallery(Context cntx, String path) { 
    try { 
     MediaScannerConnection.scanFile(cntx, new String[] { path },null, new MediaScannerConnection.OnScanCompletedListener() { 
      public void onScanCompleted(String path, Uri uri) { 
      } 
     }); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

}

+1

gracias :) tu respuesta me muestra una pista importante para establecer el fondo, que funciona como el encanto. –

0
Bitmap b = Bitmap.createBitmap(lyt.getDrawingCache()); 

lo único que puede ser null en esa línea es lyt, el resto no. Probablemente aún no haya configurado el diseño y findViewById() devolverá null en ese caso.

que tiene que hacer setContentView() antes de poder hacer findViewById()

+0

No he hecho ya que – Adham

+0

Hmm que debe significar el error no sucede en esa línea, pero en algún lugar dentro de 'Bitmap.createBitmap()' o 'lyt.getDrawingCache()'. Y creo que Renard tiene razón, si las vistas no se distribuyeron, no saben cómo dibujarse. – zapl

+0

obtuve imagen invertida. –

2

Mi conjetura es que se está ejecutando en ese código onCreate. El problema con eso es que las vistas aún no se han trazado. Llame a lyt.measure o llame al código más tarde. por ejemplo: a onSizeChanged() o en OnLayout() después de llamar a super.onLayout().

+0

cómo llamar a lyt.onMeasure() ??! – Adham

+0

siento que la función es medida(). Pero recomiendo crear el mapa de bits más tarde y no llamar a measure(). – Renard

0

A continuación se muestra la snipet código que convierte los diseños de XML a las imágenes de mapa de bits

private Bitmap convertLayoutToImage() { 
     LinearLayout linearView = (LinearLayout) this.getLayoutInflater(null).inflate(R.layout 
       .marker_layout, null, false); //you can pass your xml layout 

     linearView.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), 
       View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); 
     linearView.layout(0, 0, linearView.getMeasuredWidth(), linearView.getMeasuredHeight()); 

     linearView.setDrawingCacheEnabled(true); 
     linearView.buildDrawingCache(); 
     return linearView.getDrawingCache();// creates bitmap and returns the same 
    }