Взять весь "скриншот" прокручиваемого вида

В макете моего фрагмента у меня есть ScrollView с LinearLayout внутри

<ScrollView
    android:id="@+id/scrollview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <LinearLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <!-- Other views -->

    </LinearLayout>
</ScrollView>

Поэтому мне нужно создать и поделиться фотографией всего содержимого scrollview. Все решения, которые я пробовал, делают снимок экрана только видимой области, а не всего содержимого прокрутки. Как я могу сделать?

3 ответа

Решение

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

Bitmap bitmap = getBitmapFromView(scrollview, scrollview.getChildAt(0).getHeight(), scrollview.getChildAt(0).getWidth());

//create bitmap from the ScrollView 
private Bitmap getBitmapFromView(View view, int height, int width) {
    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    Drawable bgDrawable = view.getBackground();
    if (bgDrawable != null)
        bgDrawable.draw(canvas);
    else
        canvas.drawColor(Color.WHITE);
    view.draw(canvas);
    return bitmap;
}

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

 private void getYourLayout() {
    try {
        Dialog fb_event_info = new Dialog(YourActivity.this);
        fb_event_info.requestWindowFeature(Window.FEATURE_NO_TITLE);
        fb_event_info.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        fb_event_info.setContentView(R.layout.yourXmlLayoutFile);

        final LinearLayout lnr_fb_info = (LinearLayout) fb_event_info.findViewById(R.id.container);
        TextView tv_fb_event_name = (TextView) fb_event_info.findViewById(R.id.tv_fb_event_name);

        tv_fb_event_name.setTypeface(Global.setCubanoFont(EventDetailActivity.this));
        tv_fb_event_name.setText(tv_event_name.getText().toString());

        lnr_fb_info.setDrawingCacheEnabled(true);

        lnr_fb_info.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));

        lnr_fb_info.layout(0, 0, lnr_fb_info.getMeasuredWidth(), lnr_fb_info.getMeasuredHeight());

        lnr_fb_info.buildDrawingCache(true);
        bitmap = Bitmap.createBitmap(lnr_fb_info.getDrawingCache());


        saveImage(bitmap);

    } catch (Exception e) {
    }
}

Эта функция предназначена для сохранения вашего растрового изображения в виде файла.

  private void saveImage(Bitmap bitmap) {
    try {
        Log.e("----------in---", "saveImage....: ");
        if (!rootFile.exists())
            rootFile.mkdirs();
        long time = System.currentTimeMillis();
        fname = "mynight-" + time + ".png";
        rootFile = new File(rootFile, fname);
        Log.e("----------in---", "saveImage...1.: ");
        try {
            FileOutputStream Fout = new FileOutputStream(rootFile);
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, Fout);
            sendShareFb();
            Fout.flush();
            Fout.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Ниже функция для того, чтобы поделиться своим изображением на Facebook.

 private void sendShareFb() {
    try {
        Log.e("----------in---", "sendShareFb....: ");
        Intent fbIntent = new Intent(Intent.ACTION_SEND);

        File imageFile = new File(rootFile.toString());
        fbIntent.putExtra(Intent.EXTRA_TEXT, "Share..");
        fbIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(imageFile));
        fbIntent.setType("image/jpeg/png");
        PackageManager pm = getPackageManager();
        List<ResolveInfo> lract = pm.queryIntentActivities(fbIntent, PackageManager.MATCH_DEFAULT_ONLY);
        boolean resolved = false;
        for (ResolveInfo ri : lract) {
            if (ri.activityInfo.name.toLowerCase().contains("facebook")) {
                fbIntent.setClassName(ri.activityInfo.packageName, ri.activityInfo.name);
                resolved = true;
                break;
            }
        }
        if (!resolved) {
            Toast.makeText(EventDetailActivity.this, "Vous ne semblez pas avoir Facebook installé sur cet appareil", Toast.LENGTH_SHORT).show();
        }

        startActivity(resolved ? fbIntent : Intent.createChooser(fbIntent, "Choose one"));
    } catch (final ActivityNotFoundException e) {
        e.printStackTrace();

    }
}

Конечно, это поможет вам. Потому что это решение исправило мою проблему много раз.

Попробуйте это: https://github.com/PGSSoft/scrollscreenshot

это должно быть полезно.

Описание: Сделайте скриншоты Android для прокручиваемого содержимого экрана - предоставлено PGS Software SA

Этот инструмент делает несколько скриншотов, автоматически прокручивая содержимое экрана между каждым снимком. По умолчанию строка состояния и панель навигации включены только один раз.

Другие вопросы по тегам