截取LinearLayout和RecyclerView的截图

时间:2017-07-31 16:43:32

标签: android android-layout bitmap

我下面有一个LinearLayout和一个RecyclerView。在Google上搜索,我发现了一些代码来截取RecyclerView的截图(事实上,我无法理解它是如何工作的)。这是代码:

  public static Bitmap getRecyclerViewScreenshot(RecyclerView view) {
        int size = view.getAdapter().getItemCount();
        RecyclerView.ViewHolder holder = view.getAdapter().createViewHolder(view, 0);
        view.getAdapter().onBindViewHolder(holder, 0);
        holder.itemView.measure(View.MeasureSpec.makeMeasureSpec(view.getWidth(), View.MeasureSpec.EXACTLY),
                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
        holder.itemView.layout(0, 0, holder.itemView.getMeasuredWidth(), holder.itemView.getMeasuredHeight());
        Bitmap bigBitmap = Bitmap.createBitmap(view.getMeasuredWidth(), holder.itemView.getMeasuredHeight() * size,
                Bitmap.Config.ARGB_8888);
        Canvas bigCanvas = new Canvas(bigBitmap);
        bigCanvas.drawColor(Color.WHITE);
        Paint paint = new Paint();
        int iHeight = 0;
        holder.itemView.setDrawingCacheEnabled(true);
        holder.itemView.buildDrawingCache();
        bigCanvas.drawBitmap(holder.itemView.getDrawingCache(), 0f, iHeight, paint);
        holder.itemView.setDrawingCacheEnabled(false);
        holder.itemView.destroyDrawingCache();
        iHeight += holder.itemView.getMeasuredHeight();
        try {
            for (int i = 1; i < size; i++) {
                view.getAdapter().onBindViewHolder(holder, i);
                holder.itemView.setDrawingCacheEnabled(true);
                holder.itemView.buildDrawingCache();
                bigCanvas.drawBitmap(holder.itemView.getDrawingCache(), 0f, iHeight, paint);
                iHeight += holder.itemView.getMeasuredHeight();
                holder.itemView.setDrawingCacheEnabled(false);
                holder.itemView.destroyDrawingCache();
            }
        } catch (Exception e) {
        }

        return bigBitmap;
    }

现在我想在其中包含LinearLayout,它就在RecyclerView上方。由于我无法理解代码,因此我无法对其进行修改以包含LinearLayout。我无法理解的是与Bitmap相关的术语,如Canvas,DrawingCache。所以如果有人能提供一些基本信息,那就太好了。还帮我在处理过的Bitmap中包含linearlayout。

1 个答案:

答案 0 :(得分:1)

你可以轻松地使用它,你不需要在适配器类中编码它将在活动类中完成,你也可以截取滚动视图类型活动的截图。你必须找到布局的id哪个RecycleView在XML.i中声明,发布完整活动,你只需找到你的代码init,这个代码适用于recycleview以及嵌套滚动视图

 @Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.btn_download:

            Bitmap bitmap1 = getBitmapFromView(ll_linear);
            Log.e("ll_linear", "" + ll_linear.getWidth());
            Log.e("ll_linear", "" + ll_linear.getHeight());
            saveBitmap(bitmap1);
            break;

    }

}

public void saveBitmap(Bitmap bitmap) {
    isStoragePermissionGranted(bitmap);
}

public boolean isStoragePermissionGranted(Bitmap bitmap) {

    Date now = new Date();
    android.text.format.DateFormat.format("yyyy-MM-dd_hh:mm:ss", now);
    String mPath = Environment.getExternalStorageDirectory().toString() + "/" + now + ".jpg";

    Log.e("mpath", mPath);

    File imagePath = new File(mPath);
    FileOutputStream fos;

    if (Build.VERSION.SDK_INT >= 23) {

        if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED) {

            try {
                fos = new FileOutputStream(imagePath);
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
                fos.flush();
                fos.close();

                Toast.makeText(getApplicationContext(), imagePath.getAbsolutePath() + "", Toast.LENGTH_SHORT).show();
                boolean_save = true;
                btn_download.setText("Check image");

            } catch (FileNotFoundException e) {
                Log.e("Exception", "" + e);

            } catch (IOException e) {
                Log.e("Exception", "" + e);
            }
            Log.v("Tag", "Permission is granted");

            return true;

        } else {

            Log.v("Tag", "Permission is revoked");
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
            return false;
        }
    } else { //permission is automatically granted on sdk<23 upon installation

        File imagePath1 = new File("/sdcard/screenshotdemo.jpg");
        FileOutputStream fos1;

        try {
            fos1 = new FileOutputStream(imagePath1);
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos1);
            fos1.flush();
            fos1.close();
            Toast.makeText(getApplicationContext(), imagePath1.getAbsolutePath() + "", Toast.LENGTH_SHORT).show();
            boolean_save = true;
            btn_download.setText("Check image");

        } catch (FileNotFoundException e) {
            Log.e("Exception", "" + e);

        } catch (IOException e) {
            Log.e("Exception", "" + e);
        }
        Log.v("Tag", "Permission is granted");

        return true;
    }

}
 public static Bitmap getBitmapFromView(View view) {
    //Define a bitmap with the same size as the view
    Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
    //Bind a canvas to it
    Canvas canvas = new Canvas(returnedBitmap);
    //Get the view's background
    Drawable bgDrawable = view.getBackground();
    if (bgDrawable != null)
        //has background drawable, then draw it on the canvas
        bgDrawable.draw(canvas);
    else
        //does not have background drawable, then draw white background on the canvas
        canvas.drawColor(Color.WHITE);
    // draw the view on the canvas
    view.draw(canvas);
    //return the bitmap
    return returnedBitmap;
}