GitHub 上有个项目:https://github.com/stabib/imoji-android-sdk-ui。这个项目实现了一个小小的功能,但这个功能是我见过的实现里最好的:用手指在图像上随意选择一个区域,此区域完成闭合后,可以随意触摸边界进行调整。
有趣的是,这个功能依赖了一个 native 层的动态库,刚才想了解一下学习/重现的成本,所以分析了一下 .so 的内容。里面的组成大致有三大块:一是安卓平台 native 开发 C++ 的部分,以及它用到的和 OpenGL ES 相关的一些东东;二是它依赖的外部开源项目;三是它自己编写的部分。
它依赖的外部开源项目很明显的有三个,一个是 stb,项目地址在 https://github.com/nothings/stb,此库的功能涉及图像与字体的处理;二是 NanoVG,项目地址 https://github.com/memononen/nanovg,是一个抗失真的矢量图像渲染库,现已不再维护;三是 Clipper,项目地址为 http://angusj.com/delphi/clipper.php,下载地址为 https://sourceforge.net/projects/polyclipping/,这个库号称是最好的裁剪库。除此外,还能看到一组 vector 为前缀的 C 语言风格的函数(如 vectorBinaryInsert),应该是实现了一个动态数组,是组件作者自己写的还是外部拿来无从判断。
第三大部分是组件作者自己写的,又分为几个小部分。分别是上下文(context)、图像(image)、路径(path)、边界(border)、阴影(shadow)、浮点(float point)以及编辑器(editor)的支持,还有极少的一两个函数与 WebP 图像有关。
不管是逆出来,还是重写一份,看来工作量还是不算小的。暂时先搁着吧,又不急用。
好久不上 sf.net 了,今天因为上面的事上去看,还遇到个好萌的项目,致力于在各种环境下提供某些常见对话框的功能,而且全部是调用原生能力:https://sourceforge.net/projects/tinyfiledialogs/。