
SuperImageView 版本演进史从 CropImageView 1.0 到 2.0-RC1 的模块化重构之路【免费下载链接】SuperImageViewCrop and Rounded Corners added to an ImageView.项目地址: https://gitcode.com/gh_mirrors/su/SuperImageViewSuperImageView 是一款为 Android 开发者打造的图片裁剪与圆角图片处理库它的前身 CropImageView 诞生于 2015 年曾在 Android Arsenal 上广受好评而在 2.0-RC1 版本中项目完成了一次漂亮的模块化重构从单一控件进化为「核心库 功能插件」的灵活架构。本文将带你完整回顾这段版本演进史看懂一个开源 Android 图片裁剪库是如何一步步走向成熟的。缘起Android 原生裁剪不够用一个游戏团队的痛点Android 自带的ImageView只支持centerCrop一种裁剪策略图片总是被居中裁切无法按左上、右下、底部等位置定向裁剪。这个痛点来自游戏开发团队 [Kerad Games]README 中记载的原始需求他们需要无论屏幕尺寸如何都只显示球体的一半——左半边或右半边原生控件完全做不到。于是作者 César Díez Sánchez 开发了 CropImageView并在 README.md 中记录了完整的开发动机、使用截图与性能测试数据项目由此诞生。CropImageView 1.0 时代四轮快速迭代夯实基础1.0 时代聚焦于「裁剪」这一个核心能力迭代节奏非常快从 README.md 的 ChangeLog 可以看出清晰的演进路径版本发布日期关键更新1.0.02015-02-15初始发布支持 9 种裁剪方向minSdkVersion141.0.12015-02-17重构性能移除onLayout()开销逻辑收敛到setFrame()新增 Hugo 性能测试1.0.22015-10-22minSdkVersion 降至 7修复 API 18 设备的 ImageView 兼容 bug1.0.2.12015-10-22修复 API 18 设备因TargetApi注解导致的崩溃其中 1.0.1 的优化思路值得注意作者发现ImageView的onLayout()是空实现因此把裁剪计算全部移入setFrame()方法用最小开销完成矩阵变换。README 中附带的 Hugo 性能日志显示裁剪逻辑在 UI 线程几乎没有额外开销。这一时期的依赖坐标是com.cesards.android:cropimageview:1.0.2.1Gradle 一行即可引入十分轻量。2.0-RC1 模块化重构一拆三的全新架构进入 2.0 时代项目更名为SuperImageView并完成了一次彻底的模块化重构。从 settings.gradle 可以看到仓库被拆分为四个模块superimageview核心库负责控件与插件加载机制superimageview-imagecrop图片裁剪功能插件superimageview-roundedcorners圆角图片功能插件samples完整示例工程这次重构的核心理念是「功能即插件」裁剪和圆角不再是写死在控件里的逻辑而是各自独立的模块开发者按需引入互不干扰。接口驱动的插件化设计Crop 与 RoundedCorners 如何解耦功能模块化重构的关键在于 SuperImageView.java 中定义的抽象设计。核心控件只依赖两个接口Crop.java定义setup()、onScaleTypeChanged()、onFrameChanged()三个回调RoundedCorners.java定义setup()、onDraw()、onLayoutChanged()三个回调两个接口内部还各自嵌套了一个View接口把getDrawable()、getImageMatrix()、getWidth()等控件能力抽象出来。这样插件实现完全不依赖具体控件类核心库也无需反向依赖任何插件。使用方式同样优雅在 XML 中通过siv_cropImplementation、siv_roundedCornersImplementation两个自定义属性指定插件类的全限定名核心库用反射完成实例化见setupCrop()与setupRoundedCorners()方法再用getFeature(Class)按需取出功能实例。这就是 2.0-RC1 模块化重构的精髓——新增能力只需写一个实现接口的类无需改动核心库一行代码。9 种裁剪方向 4 角圆角功能盘点裁剪插件superimageview-imagecrop模块通过 CropType.java 中的IntDef注解定义了 9 种裁剪类型左上、上、右上、左、右、左下、下、右下以及 NONE几乎覆盖了所有屏幕对齐场景。裁剪的数学计算集中在 ImageTransformation.java先按视图与 Drawable 的宽高比计算缩放系数再根据裁剪类型计算 X/Y 平移量最终通过 Matrix 完成变换。圆角插件superimageview-roundedcorners模块通过 Corner.java 定义了 4 个角左上、右上、左下、右下可单独指定或组合出任意圆角效果配合RoundedBitmapViewDrawable、RoundedCornerImageViewHook等实现类完成绘制示例见 samples 目录。细节与兼容性API 18 前后的不同 Matrix 处理1.0 时代踩过的兼容性坑在 2.0 中被系统性地解决了。ImageTransformation内部根据Build.VERSION.SDK_INT判断API 18JELLY_BEAN_MR2之前使用PreAPI18Matrix缓存矩阵之后直接使用API18Matrix读写getImageMatrix()。这种兼容层设计既保留了老设备的稳定性又让新设备走更高效的路径。工程化与质量保障为开源协作铺路2.0 分支在工程质量上也下了功夫documentation/TOOLING.md 详细说明了三件套Checkstyle运行./gradlew checkstyle统一代码风格Lint每个模块都有对应的 lint.xml产出报告位于模块的build/reports目录Gradle Versions Plugin通过dependencyUpdates任务追踪依赖更新此外还有 code-quality 目录下的 checkstyle 与自定义 lint 规则配套 documentation/IMAGE_CROP.md、documentation/ROUNDED_CORNERS.md 等模块文档开源协作体验相当友好。结语一次值得借鉴的模块化重构范本回顾 SuperImageView 的版本演进史1.0 时代用四轮迭代打磨单一控件解决了 Android 图片裁剪的方向缺失问题2.0-RC1 则以接口驱动 插件化架构完成蜕变让裁剪、圆角各归其位兼顾了扩展性与可维护性。对于想学习 Android 自定义 View、图片矩阵变换或模块化架构的开发者来说这个项目堪称一份教科书式的源码完整代码可在superimageview/、superimageview-imagecrop/、superimageview-roundedcorners/三个模块中逐一研读。如果你也想动手体验可以直接克隆仓库git clone https://gitcode.com/gh_mirrors/su/SuperImageView然后运行 samples 模块左侧菜单、图片裁剪、圆角图片的完整示例都在里面等着你。【免费下载链接】SuperImageViewCrop and Rounded Corners added to an ImageView.项目地址: https://gitcode.com/gh_mirrors/su/SuperImageView创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考