IOS下实现高性能画板橡皮擦的办法
摘要
IOS下使用CAShapeLayer+UIBezierPath实现互动画板时橡皮擦的实现方式。
背景
要在IOS端做一个在线教育DEMO,集成音视频互动、PPT白板互动、聊天等功能。
画板实现
IOS画板有很多实现,主要有
- DrawRect+UIBezierPath:实现比较简单,橡皮擦也好实现,但是CPU较高,内存消耗大。
- CAShapeLayer+UIBezierPath:性能较好,使用GPU绘制,内存占用也小,但是橡皮擦比较难实现。
- GLES:比较底层,开发要求较高。
综合以上各个方式的特点,产品中比较合适的方案是CAShapeLayer+UIBezierPath,绘制办法很简单:
- 为了支持多方不同的线色、线宽,每一笔都创建一个新的CAShapeLayer,每一笔都是覆盖绘制;
- 使用UIBezierPath描述路径,并将path传递给CAShapeLayer;
- 调用UIView.layer的addSublayer,将CAShapeLayer绘制到当前View上;
- 缓存CAShapeLayer,在需要撤销一笔的时候只需要调用CAShapeLayer的removeFromSuperlayer,在需要重画一笔的时候重新调用UIView.layer的addSublayer。
橡皮擦实现
橡皮擦本质上跟画线是一样的动作,只是线色是背景色,如果没有背景图片,只需要把线色设置成背景色就可以实现橡皮功能。但是在有背景图片的场景下会比较麻烦,单一背景色会覆盖背景图片。这个时候需要把背景色设置成背景图片,但是需要进行一定的变换,否则橡皮擦的背景图片会发生翻转,以下是核心代码:
//创建一个新的ContextUIGraphicsBeginImageContext(self.frame.size);//获得当前ContextCGContextRef context = UIGraphicsGetCurrentContext();//CTM变换,调整坐标系,*重要*,否则橡皮擦使用的背景图片会发生翻转。CGContextScaleCTM(context, 1, -1);CGContextTranslateCTM(context, 0, -self.bounds.size.height);//图片适配到当前View的矩形区域,会有拉伸[image drawInRect:self.bounds];//获取拉伸并翻转后的图片UIImage *stretchedImg = UIGraphicsGetImageFromCurrentImageContext();//将变换后的图片设置为背景色[self setBackgroundColor:[[UIColor alloc] initWithPatternImage:stretchedImg]];//View的图层设置为原始图片,这里会自动翻转,经过这步后图层显示和橡皮背景都设置为正确的图片。self.layer.contents = (_Nullable id)image.CGImage;UIGraphicsEndImageContext();
代码和注释已经说明一切,CAShapeLayer+UIBezierPath的橡皮擦实现实际上也比较简单,只要知道原理。
另外有人的实现方式是把所有的CAShapeLayer图层合并成一张图片,然后在合并后的图片里使用UIBeizerPath的strokeWithBlendMode:kCGBlendModeClear进行混色,这也是一种办法,但是混色占用的CPU也会很高,相对来说,使用背景图片来当橡皮擦的画刷,性能是较好的。
IOS下实现高性能画板橡皮擦的办法相关推荐
- Mac下python3配置opencv3 3和Mac下单独opencv的配置以及iOS下配置opencv
#1.Mac下python3配置opencv3.3 新手受任开发一个功能,需要用到opencv.但python和opencv连接出现问题,看了大概有上百份博客的解决办法,都没有解决,快要放弃了,解决了 ...
- 解决ios下的微信页面背景音乐无法自动播放问题
前言 在做各种HTML5场景页面的时候,插入背景音乐是一个很普遍的需求.我们都知道,iOS下的safari是无法自动播放音乐的,以至一直以来形成了一种认知,iOS是无法自动播放媒体资源的.直到微信火爆 ...
- 解决Web移动端Fixed布局的方案(防止页面露底、overflow-scrolling、iOS下的 Fixed + Input BUG现象、isScroll.js)
一些细节处理 在细节处理上,其实还有很多要注意的,挑几个实际遇到比较大的问题来说一下: 有时候输入框 focus 以后,会出现软键盘遮挡输入框的情况,这时候可以尝试 input 元素的 scrollI ...
- AIR 3实现iOS下对H.264视频硬件解码
本帖最后由 nextria 于 2011-10-9 11:27 编辑 在此之前,AIR开发的应用程序在iOS下是不可能实现对H.264视频硬解码的, 也许是以一个多比特率的方式传送. 我知道,是吧? ...
- 仿Ios下拉菜单,android Spinner效果(美团下拉效果)
先上效果图: 直接上代码: Ios spinner文件 package com.choe.iosspinner;import android.app.Activity; import android. ...
- app嵌套h5,ios下去掉上下橡皮筋的效果(上下回弹)
app嵌套h5,ios下去掉上下橡皮筋的效果(上下回弹) 如果是前端自己解决的话会非常的费劲,我今天跟app开发的沟通了一下,他们很快的就解决了,所以直接用原生解决就行,不要下功夫找各种解决方法,到最 ...
- x5内核在android 4.4卡顿,css,javascript_安卓手机X5内核浏览器下动画超级卡的解决办法?,css,javascript,html5 - phpStudy...
安卓手机X5内核浏览器下动画超级卡的解决办法? 碰到一个问题,我写了一个H5页面,里面有的动画在ios手机上运行十分流畅,一点都不卡,唯独在部分安卓手机下打开十分卡,卡顿到怀疑人生,我进行了一些优化, ...
- h5 iframe嵌套页面_汇总IOS下奇葩BUG以及iframe嵌套页面带来的一些困扰
做H5开发,安卓和IOS的兼容问题经常会困扰我们,尤其是跟第三方平台合作,用到iframe嵌入式应用,令很多Web前端开发的童鞋脑壳疼,相信大家也入了不少坑,且踩且珍惜吧,呵呵^_^.今天抽时间整理一 ...
- iOS下OpenCV开发用OC还是Swift
本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 其实标题中这个问题并不准确,准确的说法应该是iOS下的OpenCV开发是使用OC还是Swift ...
最新文章
- 环信联合创始人: Saas敏捷开发实践!
- Machine Learning | (2) sklearn数据集与机器学习组成
- VS调试技巧之附加进程
- python下载百度网盘文件-python通过百度云api的方式上传或下载文件
- ASP.NETMVC View页面 序列化 c# Model 为 Json字符串
- JQuery 文本框高亮显示插件
- 车联网 python_利用百度车联网提供的天气查询接口用python查询天气信息
- python elif可以单独使用_Celery在python中的单独使用
- 泛型的基本用法和代码演示
- (45)Xilinx Counter IP核配置(六)(第9天)
- 导入别的项目到我的eclipse上出现红色感叹号问题
- c语言除去字符串多余的空格,从一个字符串中去除多余的空格(用指针描述)...
- knn算法python代码识别手写数字_python使用KNN算法识别手写数字
- linux安装qt_Ubuntu Qt 安装教程--快速下载连接(网盘)
- 加密狗破解原理和破解方法介绍
- 如何用Java解压缩WAR文件
- 8255A的控制字和C口状态字
- 条形码EAN-13码和EAN-8码的原理
- 计算机科学与技术qs排名,全球QS专业排名(计算机科学与信息技术)
- vue.nextTick()方法的使用详解(简单明了)