<强>一、绘制背景
强>
绘制背景的方法有两种:
-
<李>自己利用帆布进行绘制李>
<李>利用视图的自带方法进行绘制李>
覆盖乐趣> 公共空间setBackgroundDrawable(可拉的背景){ computeOpaqueFlags (); 如果(背景==mBackground) { 返回; } 布尔requestLayout=false; mBackgroundResource=0; …… 如果(背景!=null) { …… mBackground=背景; applyBackgroundTint (); … 其他}{/*删除*/mBackground=零; …… } computeOpaqueFlags (); 如果(requestLayout) { requestLayout (); } mBackgroundSizeChanged=true; 无效(真正的); invalidateOutline (); }
可以看到视图里面有一个变量mBackground,我们设置的背景会转成可拉的然后赋值给它,然后看它是如何绘制的,搜索画(找到绘制方法,然后看到有一个方法操作了背景drawBackground(画布),传递了画布过去,这个方法源码:
私人空间drawBackground(帆布画布){ 最后可拉的背景=mBackground; 如果(背景==null) { 返回; } setBackgroundBounds ();//如果要求尝试使用显示列表。 如果(canvas.isHardwareAccelerated (),,mAttachInfo !=零 ,,mAttachInfo。mHardwareRenderer !=null) { mBackgroundRenderNode=getDrawableRenderNode(背景、mBackgroundRenderNode); 最后RenderNode RenderNode=mBackgroundRenderNode; 如果(renderNode !=零,,renderNode.isValid ()) { setBackgroundRenderNodeProperties (renderNode); ((DisplayListCanvas)帆布).drawRenderNode (renderNode); 返回; } } 最后一个int scrollX=mScrollX; 最后一个int scrollY=mScrollY; 如果((scrollX | scrollY)==0) { background.draw(画布); 其他}{ 画布。翻译(scrollX scrollY); background.draw(画布); 画布。翻译(-scrollX -scrollY); } }
所以利用自带视图的方法,我们可以简单的完成背景的设置,交给视图处理即可。
<强>二、保存画板为图片
强>
保存图片大概有三种方法:
-
<李>自行保存自己的绘制的位图李>
<李>利用视图自带的位图李>
<李>利用视图创建位图
李>
我们之前的代码是利用一个bufferBitamp和bufferCanvas来进行绘制的,所以,我们的内容就在bufferBitmap,把它保存为图片即可:
/* * *保存图片 * @param道路保存图片的路径 */有趣的保存(路径:字符串){ 如果(! TextUtils.isEmpty(路径)){ val f=文件(路径) 如果(f.exists ()) { f.delete () } 尝试{ val=FileOutputStream (f)//以90质量保存到输出到文件输出流 mBufferBitmap.compress (Bitmap.CompressFormat.JPEG, 90年) out.flush () out.close () }捕捉(e:例外){ e.printStackTrace () } } }
但是这种方法,不能保存自行画绘制的背景。接下来看第二种方法。
在视图中,有一个setDrawingCacheEnabled方法,这个方法的作用为是开启绘图缓存,这个方法也可以增加速度,但是会占用一点内存。所以通常不需要的时候有必要对其进行清理,通过destroyDrawingCache或setDrawingCacheEnabled (false)实现。
开启了这个方法之后,我们就可以利用getDrawingCache方法来获取当前视图绘制的位图数据
所以,在视图初始化的时候,开启缓存
init { mPaint。=Paint.Style风格。//画中风笔为实的心 mPaint。颜色=颜色。红色//颜色 mPaint。strokeCap=Paint.Cap。轮//笔触为圆形 mPaint。strokeWidth=10 f//画笔大?/开启缓存 isDrawingCacheEnabled=true }
保存图片的时候,直接获取即可,把上面的mBufferBitmap改为getCacheBitmap()即可
/* * *利用视图自带方法获取位图, *前提是开启setDrawingCacheEnabled(布尔启用) */乐趣getCacheBitmap():位图{ val bm=drawingCache val结果=Bitmap.createBitmap (bm)//销毁构建的缓存 destroyDrawingCache () 返回结果 }Android画板开发之添加背景和保存画板内容为图片