2012-04-29 12 views
7

Ho provato il seguente codice per convertire il LinearLayout per immagine:Come convertire un LinearLayout in immagine?

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

} 

ma ho ottenuto NullPointerException in:

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

dove l'XML layout è:

<?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> 

risposta

8

Prova sotto il codice, funziona

Aggiungi sotto l'autorizzazione a manifestare

<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

grazie :) la tua risposta mi mostra un suggerimento importante per impostare lo sfondo, che funziona come fascino. –

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

l'unica cosa che può essere null in quella linea è lyt, il resto non può. Probabilmente non hai ancora impostato il layout e findViewById() restituirà null in questo caso.

quello che dovete fare setContentView() prima di poter fare findViewById()

+0

No Ho già fatto – Adham

+0

Hmm che dovrebbe significare l'errore non accade su quella linea, ma da qualche parte all'interno di 'Bitmap.createBitmap()' o 'lyt.getDrawingCache()'. E immagino che Renard abbia ragione, se le opinioni non si strutturano da sole non sanno come disegnare. – zapl

+0

ha l'immagine invertita. –

2

La mia ipotesi è che si sta eseguendo il codice in onCreate. Il problema è che le viste non sono ancora strutturate. Chiamare lyt.measure o chiamare il codice più tardi. ad es. su onSizeChanged() o su onLayout() dopo aver chiamato super.onLayout().

+0

come chiamare lyt.onMeasure() ??! – Adham

+0

scusa la funzione è measure(). Ma mi raccomando di creare la bitmap più tardi e non chiamare measure(). – Renard

0

riportano di seguito le pezzo di codice presentato che converte i layout XML per immagini bitmap

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 
    } 
Problemi correlati