Android画板开发之添加背景和保存画板内容为图片

  

<强>一、绘制背景
  

  

绘制背景的方法有两种:

  
      <李>自己利用帆布进行绘制李   <李>利用视图的自带方法进行绘制李   
  

 Android画板开发之添加背景和保存画板内容为图片”> <br/>
  </p>
  <p> </p>
  <p>自己绘制的背景的方法就是在onDraw回调进行绘制的时候,先画一个背景,再进行画原来的内容</p>
  
  <pre类=   覆盖乐趣>   公共空间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画板开发之添加背景和保存画板内容为图片