通过一个View创建Bitmap

来源:互联网 发布:数据库表设计 编辑:程序博客网 时间:2024/05/31 06:23
public class BitmapUtil {    //节省每次创建时产生的开销,但要注意多线程操作synchronized    private static final Canvas sCanvas = new Canvas();    /**     * 从一个view创建Bitmap:     * 注意点:绘制之前要清掉 View 的焦点,因为焦点可能会改变一个 View 的 UI 状态     * 来源:https://github.com/tyrantgit/ExplosionField     */    public static Bitmap createBitmapFromView(View view, float scale) {        if (view instanceof ImageView) {            Drawable drawable = ((ImageView) view).getDrawable();            if (drawable != null && drawable instanceof BitmapDrawable) {                return ((BitmapDrawable) drawable).getBitmap();            }        }        view.clearFocus();        Bitmap bitmap = createBitmapSafely((int) (view.getWidth() * scale),                (int) (view.getHeight() * scale), Bitmap.Config.ARGB_8888, 1);        if (bitmap != null) {            synchronized (sCanvas) {                Canvas canvas = sCanvas;                canvas.setBitmap(bitmap);                canvas.save();                // 防止 View 上面有些区域空白导致最终 Bitmap 上有些区域变黑                canvas.drawColor(Color.WHITE);                 canvas.scale(scale, scale);                view.draw(canvas);                canvas.restore();                canvas.setBitmap(null);            }        }        return bitmap;    }    //安全的创建bitmap;如果新建 Bitmap 时产生了 OOM,可以主动进行一次 GC - System.gc(),然后再次尝试创建    private static Bitmap createBitmapSafely(int width, int height, Bitmap.Config config, int retryCount) {        try {            return Bitmap.createBitmap(width, height, config);        } catch (OutOfMemoryError e) {            e.printStackTrace();            if (retryCount > 0) {                System.gc();                return createBitmapSafely(width, height, config, retryCount - 1);            }            return null;        }    }}
原创粉丝点击