Как визуализировать android вид на холст БЕЗ его рендеринга первым (т.е. без полного макета) - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь нарисовать вид на внешнем холсте, используя View.draw( Canvas canvas ). Чтобы это работало, представление должно было выполнить полный макет заранее.

Однако моя причина для вызова View.draw( Canvas canvas ) заключается в том, чтобы я мог сгенерировать PdfDocument из представления, используя при этом существующие виджеты вместо пользовательских вытащить все в моем коде. Другими словами, вызывайте полный макет представления (и его потомков) в памяти, а не на экране ... если это имеет смысл.

Я надеюсь создать представление (без его рендеринга) с фиксированной высотой и шириной, затем выгрузка представления на холст страницы PdfDocument.

Можно ли это сделать, и если да, то в чем прикол?

Если нет, есть ли лучший способ?

1 Ответ

1 голос
/ 08 марта 2020

По сравнению с рисованием на экране вам нужно установить параметры макета, меру и макет, как говорит @CommonsWare.

В моем приложении я рисую вид для сохранения в PNG и для печати, но вы можете на растровом изображении PDF-документ.

Обратите внимание, что этот метод не очень хорошо работает с прокручиваемыми объектами, потому что вы обычно получаете только то, что будет показано на экране.

В моем случае я у меня есть большое TableLayout внутри scrollview, поэтому я рисую TableLayout в растровом изображении, а не в scrollView.

Я генерирую TableLayout с именем view, затем для сохранения в PNG я делаю следующее (это может быть легко адаптировано для PDF-документа)

Извлечение кода, который я использую (так как я использую тот же код для рисования на экране, а также после того, как он был выложен, я нахожу по Id именно то, что я хочу сохранить в PNG )


int tableLayoutId = 1;
float scaleFactor = 0.5f;

TableLayout tableLayout = new TableLayout(DetailedScoresActivity.this);
        tableLayout.setId(tableLayoutId);

// More code to fill out the TableLayout and return it as `view`

// .....

// Then Need to full draw this view as it has not been shown in the gui
            view.setLayoutParams(new TableLayout.LayoutParams(TabLayout.LayoutParams.WRAP_CONTENT,
                    TabLayout.LayoutParams.WRAP_CONTENT));
            view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                    View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
            view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());


            TableLayout tableLayout = view.findViewById(tableLayoutId);

            Canvas bitmapCanvas = new Canvas();
            Bitmap bitmap = Bitmap.createBitmap(Math.round(tableLayout.getWidth() * scaleFactor), Math.round(tableLayout.getHeight() * scaleFactor), Bitmap.Config.ARGB_8888);

            bitmapCanvas.setBitmap(bitmap);
            bitmapCanvas.scale(scaleFactor, scaleFactor);
            tableLayout.draw(bitmapCanvas);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...