Проблемы Android Преобразование ViewGroup с дочерними элементами в Bitmap

Я успешное преобразование ViewGroup (RelativeLayout) в Bitmap с использованием Canvas. Однако, когда происходит отрисовка, я вижу только ViewGroup с ее фоновым рисованием и а не его дочерние элементы (два TextView), которые должны быть размещены в RelativeLayout с использованием таких правил, как FILL_PARENT.

RelativeLayout создается с использованием следующей статической функции:

public static RelativeLayout createProgrammeView(Context context, int width, int height, String title, String time) {
    RelativeLayout.LayoutParams params;

    // Layout Root View (RelativeLayout)
    RelativeLayout rlv = new RelativeLayout(context);
    params = new RelativeLayout.LayoutParams(width, height);
    rlv.setLayoutParams(params);
    rlv.setPadding(3, 3, 3, 3);
    rlv.setBackgroundResource(R.drawable.background);

    // Layout Title
    TextView tv = new TextView(context);
    params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    params.addRule(RelativeLayout.ALIGN_PARENT_TOP);
    params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
    params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
    tv.setId(R.id.title);
    tv.setLayoutParams(params);
    tv.setGravity(Gravity.CENTER_VERTICAL);
    tv.setSingleLine(true);
    tv.setEllipsize(TruncateAt.END);
    tv.setTextColor(Color.parseColor("#fff"));
    tv.setTextSize(11);
    tv.setText(title);
    rlv.addView(tv);

    // Layout Start Time
    tv = new TextView(context);
    params = new RelativeLayout.LayoutParams(16, RelativeLayout.LayoutParams.WRAP_CONTENT);
    params.addRule(RelativeLayout.BELOW, R.id.title);
    params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
    params.setMargins(0, 4, 0, 0);
    tv.setId(R.id.time);
    tv.setLayoutParams(params);
    tv.setGravity(Gravity.CENTER_VERTICAL);
    tv.setSingleLine(true);
    tv.setEllipsize(null);
    tv.setTextColor(Color.parseColor("#fff"));
    tv.setTextSize(10);
    tv.setText(time);
    rlv.addView(tv);
    }

    return rlv;
}

Затем я использую следующее, чтобы превратить RelativeLayout в Bitmap:

public static Bitmap loadBitmapFromView(RelativeLayout v) {
    Bitmap b = Bitmap.createBitmap(v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.RGB_565);
    Canvas c = new Canvas(b);
    v.draw(c);
    return b;
}

Как и ожидалось, это дает мне хороший Bitmap в требуемых мне размерах с возможностью рисования фона , но дочерние элементы не находятся в растровом изображении. Я довольно часто вызываю эти функции, чтобы создать большое изображение, которое затем отображается в пользовательском представлении в моей деятельности.

Это цикл, который вызывает статическую функцию:

public static void renderViews(final Context context) {
    largeBitmap = Bitmap.createBitmap(largeWidth, largeHeight, Bitmap.Config.RGB_565);
    Canvas largeCanvas = new Canvas(largeBitmap);

    for (int i = 0; i < items.size(); i++) {
        int leftMargin = ...SOME CALCULATIONS...;

        RelativeLayout newView = createProgrammeView(context, width, rowHeight, "Title", "21:00");
        Bitmap newViewBitmap = loadBitmapFromView(newView);

        largeCanvas.drawBitmap(newViewBitmap, leftMargin, 0, new Paint());
    }

    myCustomView.invalidate();
}

Мой пользовательский вид переопределяет функцию onDraw ():

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawBitmap(largeBitmap, 0, 0, null);
}

Из того, что я вижу, я считаю, что это потому, что Android не вызывает меру () в дочерние просмотры. Я попытался вызвать это вручную, но это не решило проблему.

Итак, я предполагаю, что я хотел бы знать, как мне добиться преобразования RelativeLayout с дочерними элементами в Bitmap и заставить Android измерять детей, чтобы они уважали свои правила относительной компоновки.

Большое спасибо всем, кто может помочь мне разобраться в этом.

Роб

15
задан Onik 13 March 2019 в 21:00
поделиться