2011-06-09 124 views
1

我对Android非常陌生,正在寻找一些帮助将视图转换为Bitmap图像。 我有一个Activity,我创建了一个RelativeLayout,并在顶部添加了2个TextViews,一个在底部。如果显示RelativeLayout本身,则Activity显示正常。 我试图将此视图转换为Bitmap并显示为ImageView(添加到LinearLayout)而不是显示RelativeLayout。但是显示器似乎并没有保留View的布局,而是将元素组合在一起并显示在图像中。在Android中将视图转换为位图图像

有人能提出一些问题吗? 下面是简单的代码我已经写

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    LayoutParams lp = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); 

    LinearLayout finalImage = new LinearLayout(this); 
    finalImage.setLayoutParams(lp); 

    RelativeLayout main = new RelativeLayout(this); 
    main.setLayoutParams(lp); 

    TextView tv = new TextView(this); 
    tv.setTextColor(Color.RED); 
    tv.setText("Top Text Content"); 
    tv.setGravity(Gravity.CENTER); 
    tv.setId(1); 
    lp = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); 
    lp.addRule(RelativeLayout.ALIGN_PARENT_TOP); 

    main.addView(tv,lp); 

    TextView headingView = new TextView(this); 
    headingView.setTextColor(Color.RED); 
    headingView.setPadding(15, 10, 10, 10); 
    headingView.setTextSize(20); 
    headingView.setText("Bottom Text Content"); 
    headingView.setGravity(Gravity.CENTER); 
    headingView.setId(2); 
    lp = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); 
    lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 
    main.addView(headingView,lp); 


    main.setDrawingCacheEnabled(true); 

// this is the important code :) 
// Without it the view will have a dimension of 0,0 and the bitmap will be null   
    main.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
      MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 
    main.layout(0, 0, main.getMeasuredWidth(), main.getMeasuredHeight()); 

    main.buildDrawingCache(true); 

Bitmap returnedBitmap = Bitmap.createBitmap(main.getDrawingCache()); 
main.setDrawingCacheEnabled(false); // clear drawing cache 


    ImageView iv = new ImageView(this); 
    iv.setImageBitmap(returnedBitmap); 

    finalImage.addView(iv); 

    //setContentView(main); 

    setContentView(finalImage); 


} 

回答

0

这段代码正常工作对我来说:

/** 
* This method provided by Romain Guy, so it should do the job better, especially it includes case for listViews 
*/ 
public static Bitmap getBitmapFromView(View view, int width, int height) { 

    //Pre-measure the view so that height and width don't remain null. 
    view.measure(View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY)); 
    //Assign a size and position to the view and all of its descendants 
    view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); 

    // Create bitmap 
    Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.RGB_565); 

    //Create a canvas with the specified bitmap to draw into 
    Canvas canvas = new Canvas(bitmap); 

    // if it's scrollView we get gull size 
    canvas.translate(-view.getScrollX(), -view.getScrollY()); 
    //Render this view (and all of its children) to the given Canvas 
    view.draw(canvas); 
    return bitmap; 
}