Скриншот Android из кода. Понял, но не идеально - PullRequest
3 голосов
/ 19 мая 2011

Я пытаюсь сделать скриншот в коде в Android. На самом деле скриншот является растровым изображением основного RelativeLayout. Снимок экрана снят, но содержимое отображается неправильно, теги fill_parent и т. Д. Не соблюдаются, а изображение отображается в левом верхнем углу с исходным размером.

Пожалуйста, помогите.

Спасибо

Это мой код:

RelativeLayout v = (RelativeLayout)findViewById(R.id.main_layout);
        v.setDrawingCacheEnabled(true);
        // this is the important code :)
        // Without it the view will have a
        // dimension of 0,0 and the bitmap will
        // be null
        v.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
        //v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
        v.layout(0, 0, v.getWidth(), v.getHeight());
        v.buildDrawingCache(true);
        Bitmap bm = Bitmap.createBitmap(v.getDrawingCache());
        v.setDrawingCacheEnabled(false); //

        if (bm != null) {
            try {
                String path = Environment.getExternalStorageDirectory()
                        .toString();
                OutputStream fOut = null;
                File file = new File(path, "screentest.jpg");
                fOut = new FileOutputStream(file);

                bm.compress(Bitmap.CompressFormat.JPEG, 85, fOut);
                fOut.flush();
                fOut.close();

                Log.e("ImagePath", "Image Path : "
                        + MediaStore.Images.Media.insertImage(
                                getContentResolver(), file.getAbsolutePath(),
                                file.getName(), file.getName()));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

А это макет:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/backImage" 
android:layout_width="fill_parent"
android:layout_height="fill_parent"
 />

<com.calendarView.CalendarView
    android:orientation="vertical"
    android:id="@+id/calendar_view"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
/> 

</RelativeLayout>

@ ns476

Ответы [ 6 ]

1 голос
/ 14 августа 2012

Укажите размер экрана в makeMeasureSpec

...
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
v.measure(MeasureSpec.makeMeasureSpec(0, size.x),
            MeasureSpec.makeMeasureSpec(0, size.y));
...

Также попробуйте установить значение setDrawingCacheQuality в высокое значение, чтобы оно возвращало растровое изображение с более высоким разрешением.

0 голосов
/ 17 августа 2012

Это хорошо работает для меня:

View content = findViewById(R.id.myElementForScreenshoot);
View screenshot = content; // or content.getRootView() for fullscreen
screenshot.refreshDrawableState();
screenshot.setDrawingCacheEnabled(true);
Bitmap b = screenshot.getDrawingCache();    

После этого вы можете обработать или сохранить растровое изображение.Надеюсь, это помогло.Приветствия

0 голосов
/ 17 августа 2012

LinearLayout ll = (LinearLayout )findViewById(R.id.layout); ll .setDrawingCacheEnabled(true); Bitmap bm = v1.getDrawingCache();

Попробуйте это

0 голосов
/ 16 августа 2012

Удалить строки:

v.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
//v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
v.layout(0, 0, v.getWidth(), v.getHeight());
0 голосов
/ 15 августа 2012

Я предполагаю, что вы делаете это во время создания. Не надо!

используйте postDelayed (Runnable, int) для выполнения Bitmap bm = Bitmap.createBitmap(v.getDrawingCache()); после отрисовки представления.

также удалите v.measure () и v.layout () это методы для вызывающей ViewGroup.

0 голосов
/ 09 марта 2012

Я думаю, вам нужно заменить

RelativeLayout v = (RelativeLayout)findViewById(R.id.main_layout);

v.setDrawingCacheEnabled(true);

v.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

v.layout(0, 0, v.getWidth(), v.getHeight());

v.buildDrawingCache(true);

Bitmap bm = Bitmap.createBitmap(v.getDrawingCache());

v.setDrawingCacheEnabled(false);

с

Bitmap bitmap;

View root = findViewById(android.R.id.content);

View v1 = root.getRootView();

v1.setDrawingCacheEnabled(true);

root.setDrawingCacheEnabled(true);

Bitmap bm = Bitmap.createBitmap(root.getDrawingCache());

root.setDrawingCacheEnabled(false);
...