сделать скриншот в локальном модульном тесте - PullRequest
0 голосов
/ 21 января 2020

как сделать скриншот (предварительный просмотр) без использования эмулятора (или устройства)?

Мне нужен какой-нибудь быстрый механизм, чтобы сделать кучу скриншотов (png) для экрана разных размеров / макетов

1 Ответ

0 голосов
/ 21 января 2020

Я не уверен, что какая-то часть макета будет работать только в 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, даже это не будет работать.

...