如何将LinearLayout转换为图像?

我尝试了下面的代码将LinearLayout转换为图像:

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

但我得到了NullPointerException

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

布局XML是:

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

Solutions Collecting From Web of "如何将LinearLayout转换为图像?"

尝试下面的代码,它的作品

在清单中添加下面的权限

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

}

我的猜测是你在onCreate中执行该代码。 这个问题的问题是,这些意见还没有完整的阐述。 要么调用lyt.measure,要么稍后调用代码。 例如:在调用super.onLayout()之后调用onSizeChanged()或onLayout()。

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

那行中唯一可以为null东西是lyt ,其余的不能。 你可能没有设置布局,在这种情况下, findViewById()将返回null

您必须先执行setContentView()然后才能执行findViewById()

看看是否可以帮助你:

在Android中将视图转换为位图图像

下面是将xml布局转换为位图图像的代码snipet

 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 }