从视图生成位图

Generate bitmap from view

当我从视图的 DrawingCache 中获取位图时,我没有收到任何错误,但我也没有看到有效的位图。我究竟做错了什么?

我用来生成位图的代码:

SharePhotoView sharePhotoView = SharePhotoView_.build(this);
sharePhotoView.bind(mCatch);

sharePhotoView.setDrawingCacheEnabled(true);
sharePhotoView.buildDrawingCache();
Bitmap bitmap = sharePhotoView.getDrawingCache();

catchImage.setImageBitmap(bitmap);

我用来制作视图的代码:

@EViewGroup(R.layout.share_photo)
public class SharePhotoView extends LinearLayout{

    @ViewById
    ImageView catchImage;

    public SharePhotoView(Context context) {
        super(context);
    }

    public void bind(Catch catchItem) {
        Bitmap bitmap = BitmapFactory.decodeFile(catchItem.getImage().getPath());

        catchImage.setImageBitmap(bitmap);

    }
}

将此代码用于视图中的位图:

Bitmap bitmap;
            try {
                bitmap = Bitmap.createBitmap(YOUR_VIEW.getWidth(), YOUR_VIEW.getHeight(),
                        Bitmap.Config.ARGB_8888);

                Canvas canvas = new Canvas(bitmap);
                YOUR_VIEW.draw(canvas);

                File root = Environment.getExternalStoragePublicDirectory(Environment.PICTURES);

                String fname = "NAME_OF_FILE.jpg";
                file = new File(root, fname);

                try {
                    if (!root.exists()) {
                    root.mkdir();
                }
                    FileOutputStream out = new FileOutputStream(file);
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
                    out.flush();
                    out.close();
                    YOUR_VIEW.destroyDrawingCache();

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

            } catch (Exception e) {
            }

在某处找到了一个可以解决问题的方法:

public static Bitmap getScreenViewBitmap(View v) {
    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(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
            View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
    v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());

    v.buildDrawingCache(true);
    Bitmap b = Bitmap.createBitmap(v.getDrawingCache());
    v.setDrawingCacheEnabled(false); // clear drawing cache

    return b;
}

来源:http://www.jattcode.com/getting-bitmap-from-a-view-visible-invisible-oncreate/