Я не уверен, что какая-то часть макета будет работать только в JVM. Так что потребуется экранный эмулятор, эмулятор или устройство, чтобы иметь скриншот экрана. Robo Electri c может позволить запускать код без эмулятора или устройства.
Затем вы можете получить макет для рисования на холст с растровым рисунком и затем сохранить растровое изображение в файл, для этого нужно запустить код,
Обратите внимание, что это сохранит весь макет, включая любые элементы вне экрана. например, представление scollview обычно создается так, чтобы соответствовать экрану, поэтому оно будет показывать только то, что на экране в данный момент (то же самое относится и к таким вещам, как recyclerview). Но для таких вещей, как TableLayouts внутри scrollview, вы получите весь TableLayout, в том числе и вне экрана. элементы
Код:
tableLayout = findViewById(R.id.table);
Canvas bitmapCanvas = new Canvas();
// Double the bitmap size and scale the Canvas to get a better resolution picture
// (Basically doubling the virtual screen resolution (Optional)
Bitmap bitmap = Bitmap.createBitmap(tableLayout.getWidth()*2, tableLayout.getHeight()*2, Bitmap.Config.ARGB_8888);
bitmapCanvas.setBitmap(bitmap);
bitmapCanvas.scale(2.0f, 2.0f);
tableLayout.draw(bitmapCanvas);
// uri is from SAF in this instance but any fileOutputStream can be used
try{
ParcelFileDescriptor pfd =
getApplicationContext().getContentResolver().
openFileDescriptor(uri, "w");
FileOutputStream fileOutputStream =
new FileOutputStream(
pfd.getFileDescriptor());
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
// PNG is a lossless format, the compression factor (100) is ignored
fileOutputStream.close();
pfd.checkError();
pfd.close();
} catch (Exception e) {
Log.e("N", e.toString());
}
Обновление: Если их вид не выложен на экране, вы можете сделать это вручную вместо findViewById
, например
TableLayout tableLayout = new TableLayout();
tableLayout.setLayoutParams(new TableLayout.LayoutParams(TabLayout.LayoutParams.WRAP_CONTENT,
TabLayout.LayoutParams.WRAP_CONTENT));
tableLayout.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
tableLayout.layout(0, 0, tableLayout.getMeasuredWidth(), tableLayout.getMeasuredHeight());
Но я все еще думаю, что без чего-то вроде Robo Electri c, предоставляющего все классы "Android" для стандартной JVM, даже это не будет работать.