通过一个View创建Bitmap
程序员文章站
2024-01-14 22:38:04
...
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;
}
}
}
推荐阅读
-
通过一个View创建Bitmap
-
如何通过一个view里面的按钮来打开另外一个view
-
在Linux中通过本地复制的方式创建多一个Oracle数据库
-
通过Java代码来创建view的方法
-
如何通过表单创建一个Word?
-
Word通过下拉型窗体域创建一个可以进行选择的下拉列表
-
使用node.js创建一个简易服务器,让本地的HTML页面可以通过localhost方式访问
-
Scala源码实战之Scala通过类创建一个对象
-
使用SAP CDS view快速创建一个Fiori应用,管理Service Order C4CCloudCDS viewCloudFoundryS/4HANA
-
Linux下通过命令行创建和设置一个MySQL用户