2012-04-29 18 views
7

Próbowałem następujący kod do konwersji LinearLayout do obrazka:Jak przekonwertować LinearLayout na obraz?

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

} 

ale mam NullPointerException w:

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

gdzie XML układ jest:

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

Odpowiedz

8

Spróbuj poniżej kod, to działa

Dodaj poniżej zgody w jawnym

<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

dzięki :) twoja odpowiedź pokazuje mi ważną wskazówkę do ustawienia tła, które działa jak urok. –

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

jedyną rzeczą, która może być null w tej linii to lyt, reszta nie może. Prawdopodobnie nie ustawiłeś jeszcze układu, a w takim przypadku zwróci null.

Trzeba zrobić setContentView() zanim będzie można zrobić findViewById()

+0

Nie mam już zrobione, że – Adham

+0

Hmm, że powinno oznaczać błąd nie zdarza się na tej linii, ale gdzieś wewnątrz 'Bitmap.createBitmap()' lub 'lyt.getDrawingCache()'. I sądzę, że Renard ma rację, jeśli poglądy nie układały się same, nie potrafią się narysować. – zapl

+0

ma odwrócony obraz. –

2

Domyślam się, że jesteś wykonywania tego kodu w onCreate. Problem polega na tym, że widoki nie są jeszcze układane. Zadzwoń do lyt.measure lub zadzwoń później. np. do onSizeChanged() lub onLayout() po wywołaniu super.onLayout().

+0

jak zadzwonić lyt.onMeasure() ?? – Adham

+0

Niestety funkcja to measure(). Ale polecam, aby później utworzyć mapę bitową i nie wywoływać metody measure(). – Renard

0

Poniżej snipet kod, który konwertuje układów xml do bitmapy

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 
    } 
Powiązane problemy