Конвертировать представление в растровое изображение в Android - PullRequest
1 голос
/ 09 июня 2011

Я довольно новичок в Android и ищу помощь в преобразовании вида в Bitmap изображение.У меня есть Activity, где я создал RelativeLayout и добавил 2 TextViews один сверху и один снизу.Activity отображается нормально, если отображается RelativeLayout.Я пытаюсь преобразовать это представление в Bitmap и отображать как ImageView (добавлено к LinearLayout) вместо отображения RelativeLayout.Но дисплей, похоже, не сохраняет макет View, вместо этого он объединяет элементы и отображает их на изображении.

Может кто-нибудь подсказать, что с этим не так?Вот простой код, который я написал

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


}

1 Ответ

0 голосов
/ 25 августа 2014

Этот фрагмент отлично работает для меня:

/**
 * 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;
}
...