📷 一个功能完整的相机包,提供WhatsApp风格的拍照体验,包含可靠的点击聚焦功能
✨ 现在使用Flutter官方camera包,确保最佳的兼容性和稳定性;默认拍摄比例固定为 4:3(竖屏为 3:4)
🎯 特色:完美的点击聚焦 + 触觉反馈 + 相册集成
v2.0.4: 曝光度控制优化,提升操作体验:
- 🎯 灵敏响应: 重新设计曝光度滑块,提升操作灵敏度 300%
- ⚡ 防抖优化: 采用防抖机制,减少频繁 API 调用,提升流畅度
- 🖱️ 交互增强: 扩大触摸区域,支持整个滑块区域拖拽操作
- 📱 即时反馈: UI 立即响应,相机设置延迟更新,无卡顿感
v2.0.3: 极致拍照性能优化,达到原生相机响应速度:
- 🚀 超快速模式: 新增
WhatsappCamera.ultraFastMode(),拍照响应 < 200ms - ⚡ 异步处理: 快速/超快速模式采用异步保存,立即返回结果
- 🎯 智能分流: 三种模式满足不同性能需求(标准/快速/超快速)
- ⏱️ 极致响应: 超快速模式比原来快 85%+,接近原生相机体验
v2.0.2: 大幅优化拍照性能,解决拍照延迟问题:
- ⚡ 快速拍照模式: 新增
WhatsappCamera.fastMode()构造函数,跳过图像处理 - 🚀 性能优化: 标准模式下优化图像处理流程,减少 60-80% 处理时间
- 🎯 智能跳过: 自动跳过不必要的 EXIF 烘焙和图像旋转操作
- ⏱️ 响应提升: 拍照延迟从 1-2 秒降低到 200-500 毫秒
v2.0.1: 修复手机平放时拍摄失败的问题,增强设备方向检测的稳定性:
- 🔧 修复平放拍摄: 解决手机平放时无法拍摄的问题
- 🧭 智能方向检测: 传感器无法识别方向时默认使用横屏
- 🛡️ 多层容错机制: 增加方向检测失败时的备用方案
- 📱 UI 稳定性: 优化平放状态下的界面旋转处理
v2.0.0: 我们已从camerawesome迁移到 Flutter 官方camera包,以解决聚焦功能问题。新版本提供:
- ✅ 可靠的点击聚焦: 真正有效的相机聚焦功能
- ✅ 触觉反馈: 点击时的震动反馈
- ✅ 完美兼容: 支持所有 Flutter 版本
- ✅ API 不变: 现有代码无需修改
标准模式 (默认,支持 4:3 裁剪):
List<File>? res = await Navigator.push(
context, MaterialPageRoute(
builder: (context) => const WhatsappCamera(),
),
);快速模式 (跳过图像处理,极速拍照):
List<File>? res = await Navigator.push(
context, MaterialPageRoute(
builder: (context) => const WhatsappCamera.fastMode(),
),
);超快速模式 (极致响应,< 200ms):
List<File>? res = await Navigator.push(
context, MaterialPageRoute(
builder: (context) => const WhatsappCamera.ultraFastMode(),
),
);自定义配置:
List<File>? res = await Navigator.push(
context, MaterialPageRoute(
builder: (context) => const WhatsappCamera(
fastCaptureMode: true, // 启用快速模式
ultraFastMode: true, // 启用超快速模式
force43: false, // 不强制 4:3 裁剪
jpegQuality: 80, // 降低质量以提升速度
enableLogs: false, // 关闭调试日志
),
),
);- 🎯 完美聚焦 - 点击屏幕任意位置实现精准聚焦,真正有效!
- ☀️ 智能亮度调整 - iOS 风格的曝光补偿滑块,超灵敏操作,即时响应
- 🔍 两指缩放 - 支持两指捏合缩放,实时显示缩放倍数,完全仿照 iOS 相机体验
- ⚡ 快速拍照 - 支持快速模式,跳过图像处理,拍照延迟降低 80%
- 🚀 超快速模式 - 极致响应速度,< 200ms 拍照体验,接近原生相机
- 🎯 异步处理 - 后台保存到相册,用户无需等待
- 📱 无变形预览 - 预览固定为 4:3(竖屏为 3:4),与最终成片一致,无变形
- 📸 灵活裁剪 - 可选的 4:3 裁剪(可关闭以获得最佳性能)
- 🖼️ 相册集成 - 无缝访问设备相册选择照片
- 🔄 双摄像头 - 前后摄像头自由切换
- 💡 智能闪光灯 - 自动/开启/关闭/手电筒模式
- 📳 触觉反馈 - 点击时的震动反馈,提升用户体验
- 🎨 视觉反馈 - 专业的聚焦指示器动画
- 💾 自动保存 - 拍摄的照片自动保存到相册
点击聚焦功能:
- 在相机预览界面点击任意位置进行像素级精准聚焦
- 重新设计坐标系统:基于 AspectRatio 组件的实际布局行为,确保点击位置和聚焦位置完全一致
- 多指检测优化:30ms 延迟检测机制,彻底避免双指缩放时误触发聚焦
- 智能区域检测:只在实际预览区域内响应点击,自动忽略黑边区域
- 简化算法:移除复杂的安全区域计算,直接基于屏幕坐标和预览布局
- 会出现白色聚焦框动画指示聚焦位置
- 聚焦框会在 1.5 秒后自动消失
- 触觉反馈:点击时有轻微震动反馈,提升用户体验
- 兼容现代设备的连续自动聚焦系统
- 支持实时调试信息输出,方便开发者排查问题
亮度调整功能:
- 点击聚焦时,聚焦框右侧自动显示亮度调整滑块
- iOS 原生相机风格的垂直滑块设计,支持上下拖拽调节亮度
- 超灵敏响应: 重新设计的灵敏度算法,操作响应提升 300%
- 防抖优化: 50ms 防抖机制,减少频繁调用,操作更流畅
- 扩大触摸区域: 支持整个滑块区域拖拽,操作更容易
- 即时反馈: UI 立即响应,相机设置异步更新,无延迟感
- 滑块顶部显示太阳图标(增加亮度),底部显示月亮图标(降低亮度)
- 实时显示当前曝光补偿数值,范围通常为 -4.0 到 +4.0
- 拖拽滑块时自动延长显示时间,确保调整体验流畅
- 切换摄像头时自动重置曝光值,适配不同摄像头的特性
两指缩放功能:
- 支持标准的两指捏合手势进行缩放,与 iOS 原生相机体验完全一致
- 智能手势识别:只有两指及以上手势才激活缩放,避免误触
- 双重防护机制:Scale 事件标记 + TapDown 延迟检测,确保多指操作时绝不触发聚焦
- 实时显示当前缩放倍数,缩放范围通常为 1.0x 到 10.0x
- 缩放倍数大于 1.0x 时,屏幕上方自动显示缩放指示器
- 切换摄像头时自动重置缩放级别,适配不同摄像头的缩放能力
- 缩放操作流畅顺滑,无延迟感
- 手势结束时自动清理状态,确保下次操作正常
预览和拍摄一致性:
- 固定显示比例:预览固定为 4:3(竖屏为 3:4),避免任何拉伸变形
- 所见即所得:预览与成片比例一致。横屏拍摄输出横向 4:3,竖屏拍摄输出竖向 3:4
- 使用 AspectRatio + 居中裁切,预览区域可能出现黑边(与 iOS 相机类似)
- 方向正确:自动烘焙 EXIF 方向,确保相册中显示方向与拍摄时一致
- 高质量拍摄:使用 veryHigh 分辨率,先拍原图后高质量裁剪为 4:3/3:4
设备方向检测与容错:
- 物理传感器优先:使用 native_device_orientation 获取真实的物理方向
- 平放状态处理:手机平放时传感器返回 unknown,自动启用容错机制
- 智能备用方案:检测屏幕当前方向,无法识别时默认横屏(按用户要求)
- 多层容错保护:传感器失败 → 屏幕方向 → 默认横屏,确保拍摄功能永不失效
- UI 稳定性:平放状态下保持上一个有效方向,避免界面元素抖动
- 调试友好:详细的方向检测日志,方便开发者排查问题
🏗️ 技术架构:
- 📦 Flutter 官方 camera: 使用官方维护的 camera 包,确保长期稳定性
- 🎯 真实聚焦 API: 调用
setFocusPoint和setExposurePoint实现真正聚焦 - ☀️ 专业曝光控制: 使用
setExposureOffsetAPI 实现精准的曝光补偿调整 - 🔍 智能缩放系统: 使用
setZoomLevelAPI 实现平滑缩放,支持多指手势识别和状态管理 - 🧭 智能方向检测: 使用 native_device_orientation 实现精准的物理方向检测,支持平放状态容错
- 🛡️ 多层容错机制: 传感器失败时使用屏幕方向,无法识别时默认横屏,确保拍摄功能始终可用
- ⚡ 双模式架构: 快速模式跳过所有图像处理,标准模式提供完整功能
- 🚀 智能优化: 自动跳过不必要的 EXIF 烘焙、图像旋转等耗时操作
- 🎯 性能监控: 详细的性能日志,实时监控各环节耗时
- 🎨 iOS 风格 UI: 完全仿照 iOS 原生相机的亮度调节滑块和缩放指示器设计
- 📱 智能预览适配: 使用相机原生比例显示预览,确保画面无变形,聚焦位置像素级准确
- 🔧 开发友好: 详细的控制台日志输出,包含分辨率、宽高比、缩放范围、方向检测等调试信息
- ⚡ 高性能: veryHigh 分辨率 + JPEG 格式,最佳画质和兼容性
- 💫 用户体验: 视觉动画 + 触觉震动 + 流畅交互 + 多点触控,媲美原生应用
- 🛡️ 类型安全: 完整的类型检查,避免运行时错误
- 🔄 向后兼容: API 保持不变,现有代码无需修改
⚡ 性能优化特性:
- 三种拍照模式: 标准模式(完整功能)/ 快速模式(< 300ms)/ 超快速模式(< 200ms)
- 异步保存: 快速/超快速模式采用后台异步保存,立即返回结果
- 智能处理: 自动检测是否需要裁剪和旋转,避免不必要的操作
- 优化编码: 动态调整 JPEG 质量,平衡文件大小和处理速度
- 并行处理: 方向检测和图像处理采用异步并行处理
- 内存优化: 及时释放图像处理中间结果,减少内存占用
- 容错降级: 处理失败时优雅降级到快速模式,确保功能可用
- 响应优先: 超快速模式优先用户体验,后台完成耗时操作
Open image:
Navigator.push(
context, MaterialPageRoute(
builder: (context) => const ViewImage(
image: 'https://...',
imageType: ImageType.network,
),
),
);add permissions:
file: /android/app/main/AndroidManifest.xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:requestLegacyExternalStorage="true"
...file: android/app/build.gradle
minSdkVersion 21
compileSdkVersion 33file: /ios/Runner/Info.plist
<key>NSCameraUsageDescription</key>
<string>Can I use the camera please?</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Used to demonstrate image picker plugin</string>Feito com ❤️ by Weliton Sousa
