Android画板开发(一) 基本画笔的实现
Android画板开发(二) 橡皮擦实现
Android画板开发(三) 撤销反撤销功能实现
Android画板开发(四) 添加背景和保存画板内容为图片
Android画板开发(五) 添加文本文字

一、绘制背景

绘制背景的方法有两种:

  • 自己利用canvas进行绘制
  • 利用view的自带方法进行绘制

1.1 canvas绘制背景

自己绘制的背景的方法就是在onDraw回调进行绘制的时候,先draw一个背景,再进行draw原来的内容

    override fun onDraw(canvas: Canvas) {super.onDraw(canvas)//先绘制颜色作为背景canvas.drawColor(Color.BLACK)//画出缓存bitmap的内容canvas.drawBitmap(mBufferBitmap,0f,0f,null)}

1.2 view自带方法

view有setBackground方法,我利用这个方法设置背景setBackgroundResource(R.drawable.bg),这个方法是怎么样执行的,来简单跟踪一下源码,ctrl+鼠标左键 进去这个方法,最终跳到了setBackgroundDrawable,下面是源码(删减了)

    public void setBackgroundDrawable(Drawable background) {computeOpaqueFlags();if (background == mBackground) {return;}boolean requestLayout = false;mBackgroundResource = 0;......if (background != null) {......mBackground = background;applyBackgroundTint();...} else {/* Remove the background */mBackground = null;.......}computeOpaqueFlags();if (requestLayout) {requestLayout();}mBackgroundSizeChanged = true;invalidate(true);invalidateOutline();}

可以看到view里面有一个变量mBackground,我们设置的背景会转成Drawable然后赋值给它,然后看它是如何绘制的,搜索draw(找到绘制方法,然后看到有一个方法操作了背景drawBackground(canvas),传递了画布过去,这个方法源码:

    private void drawBackground(Canvas canvas) {final Drawable background = mBackground;if (background == null) {return;}setBackgroundBounds();// Attempt to use a display list if requested.if (canvas.isHardwareAccelerated() && mAttachInfo != null&& mAttachInfo.mHardwareRenderer != null) {mBackgroundRenderNode = getDrawableRenderNode(background, mBackgroundRenderNode);final RenderNode renderNode = mBackgroundRenderNode;if (renderNode != null && renderNode.isValid()) {setBackgroundRenderNodeProperties(renderNode);((DisplayListCanvas) canvas).drawRenderNode(renderNode);return;}}final int scrollX = mScrollX;final int scrollY = mScrollY;if ((scrollX | scrollY) == 0) {background.draw(canvas);} else {canvas.translate(scrollX, scrollY);background.draw(canvas);canvas.translate(-scrollX, -scrollY);}}

所以利用自带view的方法,我们可以简单的完成背景的设置,交给View处理即可。

二、 保存画板为图片

保存图片大概有三种方法:

  • 自行保存自己的绘制的Bitmap
  • 利用view自带的bitmap
  • 利用view创建bitmap

2.1 自己绘制的Bitmap

我们之前的代码 是利用一个bufferBitamp和bufferCanvas来进行绘制的,所以,我们的内容就在bufferBitmap,把它保存为图片即可:

    /*** 保存图片* @param path 保存图片的路径*/fun save(path: String){if(!TextUtils.isEmpty(path)){val f = File(path)if(f.exists()){f.delete()}try{val out = FileOutputStream(f)//以90质量保存到输出到文件输出流mBufferBitmap.compress(Bitmap.CompressFormat.JPEG,90,out)out.flush()out.close()}catch (e:Exception){e.printStackTrace()}}}

但是这种方法,不能保存自行draw绘制的背景。接下来看第二种方法。

2.2 View的drawingCache

在View中,有一个setDrawingCacheEnabled方法,这个方法的作用为是开启绘图cache,这个方法也可以增加速度,但是会占用一点内存。所以通常不需要的时候有必要对其进行清理,通过destroyDrawingCache或setDrawingCacheEnabled(false)实现。

开启了这个方法之后,我们就可以利用getDrawingCache方法来获取当前view绘制的bitmap数据

所以,在view初始化的时候,开启缓存

    init {mPaint.style = Paint.Style.STROKE //画笔为实心mPaint.color = Color.RED         //颜色mPaint.strokeCap = Paint.Cap.ROUND //笔触为圆形mPaint.strokeWidth = 10f            //画笔大小//开启缓存isDrawingCacheEnabled = true}

保存图片的时候,直接获取即可,把上面的mBufferBitmap改为getCacheBitmap()即可

 /*** 利用view自带方法获取bitmap,* 前提是开启setDrawingCacheEnabled(boolean enabled)*/fun getCacheBitmap(): Bitmap{val bm = drawingCacheval result = Bitmap.createBitmap(bm)//销毁build的缓存destroyDrawingCache()return result}

2.3 利用view创建bitmap

利用Bitmap的createBitmap方法,创建当前view为bitmap。

fun getBitmap(v: View): Bitmap{val bitmap = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888)val canvas = Canvas(bitmap)v.draw(canvas)return bitmap}

Android画板开发(四) 添加背景和保存画板内容为图片相关推荐

  1. Android音频开发(四):音频播放模式

    一.Android音频开发(一):音频基础知识 二.Android音频开发(二):录制音频(WAV及MP3格式) 三.Android音频开发(三):使用ExoPlayer播放音频 四.Android音 ...

  2. Android WebView开发(四):WebView独立进程解决方案

    一.Android WebView开发(一):基础应用 二.Android WebView开发(二):WebView与Native交互 三.Android WebView开发(三):WebView性能 ...

  3. 【Android游戏开发十二】(保存游戏数据 [上文])详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!

     李华明Himi 原创,转载务必在明显处注明: 转载自 [黑米GameDev街区] 原文链接:  http://www.himigame.com/android-game/327.html 很多童鞋说 ...

  4. 微信小程序--云开发仿QQ动态发布(发布内容、图片)

    前言 微信小程序的云开发非常适合初级开发者,特别是对传统后端不是了解的开发者非常友好,我们只需要根据开发文档查找对应的函数即可(当然,微信开发文档坑是非常的多啊,一定要小心!) 下面就用云开发做一个类 ...

  5. Android 应用开发----ViewPager---PagerTitleStrip添加标题栏

    ViewPager 详解 PagerTabStrip与PagerTitleStrip添加标题栏的异同 一.PagerTitleStrip 先看个简单的,先上个效果图,吸引大家一下眼球. 三个页面间的滑 ...

  6. Android app开发 如何添加启动界面

    打开任意的一个app时,其中大部分都会显示一个启动界面,于我而言印象最深的就是微信的大地球了,启动界面通常情况下展示出的都是自家的logo,但也有甚者则直接把广告放到了上面. 在这里为大家提供两种不同 ...

  7. Android Launcher开发(五)添加应用程序桌面快捷方常见问题及解决方案

    最近做到的应用做刚好需要添加快捷方式的功能, 在参考了源代码和网上一些其他资料后做了出来. 在做的时候遇到两个问题, 一.  程序卸载后桌面快捷方式仍然存在: 关于此问题, 网上的资料和实际中很多应用 ...

  8. Android游戏开发指南一背景地图

    1.孤岛使用三张背景层,一张大的静态的图,一个中间的tilemap,和前景tilemap 2.32X32 tiles, means that 120 tiles should be draw in o ...

  9. 【安卓开发 】Android初级开发(四)ListView

    ListView的实现步骤 1.单独一行的布局可以如下 <?xml version="1.0" encoding="utf-8"?> <Lin ...

最新文章

  1. Python踩坑指南(第三季)
  2. Spring data redis应用示例
  3. 复现经典:《统计学习方法》第 9 章 EM 算法及其推广
  4. 深入探讨数据仓库建模与ETL的实践技巧
  5. 看到一个有趣的东东。
  6. 物化视图是否可以exp导出_物化视图导出导入可能导致物化视图日志的失效
  7. TensorFlow: couldn’t open CUDA library cupti64_80.dll、InternalError: Blas SGEMM launch failed
  8. 卷组删除pv_如何安全的删除Linux LVM中的PV物理卷(硬盘或分区)
  9. 决策树对鸢尾花数据两特征组合分类python代码的结果_机器学习笔记-决策树
  10. android 家庭监控,最好的三款家庭安防智能监控APP
  11. 产品经理的素质能力模型
  12. HDU 613 Kolakoski
  13. ye321片库_jQuery的简约幻灯片库
  14. 5月17号,记住这一天
  15. 浅析N沟道增强型MOS管双向低频开关电路
  16. Jsbeautifier JS代码美化库
  17. H.323-SIP信令网关的实现
  18. 两个指针变量不可以做什么
  19. 学计算机用多大的u盘合适,u盘装系统需要多大的u盘?很多人都做错了!
  20. 深度学习前沿 | 利用GAN预测股价走势

热门文章

  1. 英文论文写作常用例句整理汇总(持续更新)
  2. ant-design Table组件错位/对不齐
  3. 【python】类继承中super的用法
  4. myEclipse破解工具run.bat一闪而过 报错信息com.sun.java.swing. plaf.nimbus.NimbusLookAndFeel
  5. 文明大爆炸服务器维护,《文明大爆炸》完整版萌新攻略来袭!
  6. 解决VUE返回上一页,上一页空白问题
  7. 使用小程序+C#实现人脸、手势双重识别认证
  8. 自媒体怎么做,才能在短时间内变现赚钱?
  9. IPv6技术-什么是IPv6
  10. python 最快 因式分解_python的因式分解