EasyWatermark核心组件揭秘从WaterMark模型到UI面板的完整架构解析【免费下载链接】EasyWatermark Securely, easily add a watermark to your sensitive photos. 安全、简单地为你的敏感照片添加水印防止被人泄露、利用项目地址: https://gitcode.com/gh_mirrors/ea/EasyWatermarkEasyWatermark是一款开源Android水印应用专注于为敏感照片添加安全水印。本文将深入解析其核心架构从数据模型到UI面板的完整实现。这款应用采用现代化Android架构结合Kotlin协程和Jetpack组件为用户提供流畅的水印添加体验。 核心数据模型WaterMark类在data/model/WaterMark.kt文件中定义了应用的核心数据模型。WaterMark类包含了水印的所有配置属性data class WaterMark( val text: String, // 水印文本 val textSize: Float, // 文字大小 val textColor: Int, // 文字颜色 val textStyle: TextPaintStyle, // 文字样式 val textTypeface: TextTypeface, // 字体类型 val alpha: Int, // 透明度 val degree: Float, // 旋转角度 val hGap: Int, // 水平间距 val vGap: Int, // 垂直间距 val iconUri: Uri, // 图标URI val markMode: WaterMarkRepository.MarkMode, // 水印模式 val enableBounds: Boolean, // 是否启用边界 val tileMode: Shader.TileMode // 平铺模式 )这个数据模型是应用的核心所有水印配置都通过这个类进行管理。通过Keep注解确保在ProGuard混淆时保持完整性。 UI层架构MainActivity与ViewModelMainActivity用户交互中心MainActivity.kt作为应用的主界面负责处理用户交互和UI展示。它采用MVVM架构通过LaunchView自定义视图管理不同的界面状态AndroidEntryPoint class MainActivity : AppCompatActivity() { private val viewModel: MainViewModel by viewModels() private lateinit var launchView: LaunchView // 功能面板列表 private val contentFunList: ListFuncTitleModel by lazy { listOf( FuncTitleModel(FuncTitleModel.FuncType.Text, 文字水印, R.drawable.ic_func_text), FuncTitleModel(FuncTitleModel.FuncType.Icon, 图片水印, R.drawable.ic_func_sticker) ) } }MainViewModel业务逻辑处理MainViewModel.kt负责处理所有业务逻辑包括图片处理、水印生成和状态管理HiltViewModel class MainViewModel Inject constructor( private val userRepo: UserConfigRepository, private val waterMarkRepo: WaterMarkRepository, private val templateRepo: TemplateRepository ) : ViewModel() { // 核心数据流 val waterMark: LiveDataWaterMark waterMarkRepo.waterMark.asLiveData() val selectedImage: LiveDataImageInfo waterMarkRepo.selectedImage.asLiveData() val imageList: LiveDataPairListImageInfo, Boolean ... // 水印生成核心方法 private suspend fun generateImage( contentResolver: ContentResolver, viewInfo: ViewInfo, imageInfo: ImageInfo ): ResultUri ... } 水印渲染引擎WaterMarkImageView核心渲染组件WaterMarkImageView.kt是应用的核心渲染组件负责将水印应用到图片上。它继承自AppCompatImageView并实现了CoroutineScopeclass WaterMarkImageView : androidx.appcompat.widget.AppCompatImageView, CoroutineScope { // 水印配置 var config: WaterMark? null // 渲染水印的核心方法 override fun onDraw(canvas: Canvas) { super.onDraw(canvas) if (config?.text.isNullOrEmpty() || layoutShader null) { return } // 根据平铺模式绘制水印 if (config?.obtainTileMode() Shader.TileMode.CLAMP) { // 单次绘制模式 canvas.translate(...) canvas.drawRect(...) } else { // 平铺模式 canvas.drawRect(...) } } }水印Shader生成应用支持两种水印模式文字水印和图片水印通过不同的Shader生成策略实现companion object { // 生成文字水印Shader suspend fun buildTextBitmapShader( imageInfo: ImageInfo, config: WaterMark, textPaint: TextPaint, coroutineContext: CoroutineContext ): WaterMarkShader? { // 使用StaticLayout处理多行文本 val staticLayout StaticLayout.Builder.obtain(...).build() // 计算旋转后的尺寸 val fixWidth textWidth * cos(radians) textHeight * sin(radians) val fixHeight textWidth * sin(radians) textHeight * cos(radians) // 创建位图Shader val bitmapShader BitmapShader(bitmap, tileMode, tileMode) } // 生成图片水印Shader suspend fun buildIconBitmapShader( imageInfo: ImageInfo, srcBitmap: Bitmap, config: WaterMark, textPaint: Paint, scale: Boolean, coroutineContext: CoroutineContext ): WaterMarkShader? { // 缩放图片水印 val scaleRatio config.textSize / 14f val targetBitmap Bitmap.createBitmap(...) // 应用旋转和绘制 canvas.rotate(config.degree, ...) canvas.drawBitmap(scaleBitmap, ...) } } 功能面板系统模块化面板设计应用采用模块化的面板设计每个功能都有独立的Fragment文字内容面板-TextContentDisplayFragment.kt颜色选择面板-ColorFragment.kt透明度调节面板-AlphaPbFragment.kt旋转角度面板-DegreePbFragment.kt文字样式面板-TextStyleFragment.kt平铺模式面板-TileModeFragment.kt每个面板都通过BaseBindFragment基类实现确保一致的UI体验和状态管理。数据持久化WaterMarkRepository.kt负责水印配置的持久化存储使用Android DataStore进行轻量级数据存储Singleton class WaterMarkRepository Inject constructor( Named(WaterMarkPreferences) private val dataStore: DataStorePreferences ) { val waterMark: FlowWaterMark dataStore.data .map { WaterMark( text it[KEY_TEXT] ?: 默认水印文本, textSize (it[KEY_TEXT_SIZE] ?: 14f).coerceAtLeast(1f), textColor it[KEY_TEXT_COLOR] ?: Color.parseColor(#FFB800), // ... 其他属性 ) } } 性能优化策略1. 图片加载优化应用使用decodeSampledBitmapFromResource进行图片采样避免内存溢出val inSample calculateInSampleSize( mutableBitmap.width, mutableBitmap.height, WaterMarkImageView.calculateDrawLimitWidth(...), WaterMarkImageView.calculateDrawLimitHeight(...) )2. 协程异步处理所有耗时的图片处理操作都在协程中执行确保UI流畅private suspend fun generateImage(...): ResultUri withContext(Dispatchers.IO) { // 图片处理逻辑 }3. 内存管理使用Bitmap.Config.ARGB_8888确保高质量输出及时回收不再使用的Bitmap对象使用inSampleSize减少内存占用 项目架构总结EasyWatermark采用清晰的架构分层数据层-data/model/和data/repo/WaterMark数据模型Repository数据访问层DataStore持久化存储业务逻辑层-ui/MainViewModel.kt处理图片选择、水印生成管理应用状态和配置协调数据层和UI层UI层-ui/和ui/panel/MainActivity主界面功能面板Fragment自定义视图组件工具层-utils/文件处理工具图片处理工具扩展函数 开发技巧与最佳实践1. 状态管理应用使用StateFlow和LiveData进行响应式状态管理确保UI与数据同步private val _selectedImage MutableStateFlow(ImageInfo.empty()) val selectedImage: StateFlowImageInfo _selectedImage val waterMark: FlowWaterMark dataStore.data .map { preferences - // 映射配置到WaterMark对象 }2. 依赖注入使用Hilt进行依赖注入简化组件管理HiltViewModel class MainViewModel Inject constructor( private val userRepo: UserConfigRepository, private val waterMarkRepo: WaterMarkRepository, private val templateRepo: TemplateRepository ) : ViewModel()3. 错误处理完善的错误处理机制包括内存溢出、文件不存在等情况try { // 图片处理逻辑 } catch (fne: FileNotFoundException) { info.result Result.failure(null, code TYPE_ERROR_FILE_NOT_FOUND) } catch (oom: OutOfMemoryError) { info.result Result.failure(null, code TYPE_ERROR_SAVE_OOM) } 核心功能亮点1. 灵活的平铺模式支持多种Shader.TileModeCLAMP- 边缘拉伸REPEAT- 重复平铺MIRROR- 镜像平铺2. 实时预览水印效果实时预览所有修改立即反映在图片上。3. 批量处理支持多张图片批量添加水印提高工作效率。4. 模板系统内置水印模板系统可以保存常用水印配置。 未来扩展方向基于当前架构EasyWatermark可以轻松扩展以下功能更多水印样式- 支持渐变、阴影等效果AI智能水印- 基于内容的水印位置推荐云端同步- 水印配置云端备份批量导出- 支持多种格式批量导出 学习资源官方文档docs/official.md核心源码app/src/main/java/me/rosuh/easywatermark/UI组件app/src/main/java/me/rosuh/easywatermark/ui/widget/EasyWatermark的架构设计体现了现代Android应用开发的最佳实践通过清晰的层次分离和模块化设计实现了功能丰富且性能优秀的水印应用。无论是学习Android架构设计还是开发类似的应用这个项目都提供了宝贵的参考价值。【免费下载链接】EasyWatermark Securely, easily add a watermark to your sensitive photos. 安全、简单地为你的敏感照片添加水印防止被人泄露、利用项目地址: https://gitcode.com/gh_mirrors/ea/EasyWatermark创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
EasyWatermark核心组件揭秘:从WaterMark模型到UI面板的完整架构解析
EasyWatermark核心组件揭秘从WaterMark模型到UI面板的完整架构解析【免费下载链接】EasyWatermark Securely, easily add a watermark to your sensitive photos. 安全、简单地为你的敏感照片添加水印防止被人泄露、利用项目地址: https://gitcode.com/gh_mirrors/ea/EasyWatermarkEasyWatermark是一款开源Android水印应用专注于为敏感照片添加安全水印。本文将深入解析其核心架构从数据模型到UI面板的完整实现。这款应用采用现代化Android架构结合Kotlin协程和Jetpack组件为用户提供流畅的水印添加体验。 核心数据模型WaterMark类在data/model/WaterMark.kt文件中定义了应用的核心数据模型。WaterMark类包含了水印的所有配置属性data class WaterMark( val text: String, // 水印文本 val textSize: Float, // 文字大小 val textColor: Int, // 文字颜色 val textStyle: TextPaintStyle, // 文字样式 val textTypeface: TextTypeface, // 字体类型 val alpha: Int, // 透明度 val degree: Float, // 旋转角度 val hGap: Int, // 水平间距 val vGap: Int, // 垂直间距 val iconUri: Uri, // 图标URI val markMode: WaterMarkRepository.MarkMode, // 水印模式 val enableBounds: Boolean, // 是否启用边界 val tileMode: Shader.TileMode // 平铺模式 )这个数据模型是应用的核心所有水印配置都通过这个类进行管理。通过Keep注解确保在ProGuard混淆时保持完整性。 UI层架构MainActivity与ViewModelMainActivity用户交互中心MainActivity.kt作为应用的主界面负责处理用户交互和UI展示。它采用MVVM架构通过LaunchView自定义视图管理不同的界面状态AndroidEntryPoint class MainActivity : AppCompatActivity() { private val viewModel: MainViewModel by viewModels() private lateinit var launchView: LaunchView // 功能面板列表 private val contentFunList: ListFuncTitleModel by lazy { listOf( FuncTitleModel(FuncTitleModel.FuncType.Text, 文字水印, R.drawable.ic_func_text), FuncTitleModel(FuncTitleModel.FuncType.Icon, 图片水印, R.drawable.ic_func_sticker) ) } }MainViewModel业务逻辑处理MainViewModel.kt负责处理所有业务逻辑包括图片处理、水印生成和状态管理HiltViewModel class MainViewModel Inject constructor( private val userRepo: UserConfigRepository, private val waterMarkRepo: WaterMarkRepository, private val templateRepo: TemplateRepository ) : ViewModel() { // 核心数据流 val waterMark: LiveDataWaterMark waterMarkRepo.waterMark.asLiveData() val selectedImage: LiveDataImageInfo waterMarkRepo.selectedImage.asLiveData() val imageList: LiveDataPairListImageInfo, Boolean ... // 水印生成核心方法 private suspend fun generateImage( contentResolver: ContentResolver, viewInfo: ViewInfo, imageInfo: ImageInfo ): ResultUri ... } 水印渲染引擎WaterMarkImageView核心渲染组件WaterMarkImageView.kt是应用的核心渲染组件负责将水印应用到图片上。它继承自AppCompatImageView并实现了CoroutineScopeclass WaterMarkImageView : androidx.appcompat.widget.AppCompatImageView, CoroutineScope { // 水印配置 var config: WaterMark? null // 渲染水印的核心方法 override fun onDraw(canvas: Canvas) { super.onDraw(canvas) if (config?.text.isNullOrEmpty() || layoutShader null) { return } // 根据平铺模式绘制水印 if (config?.obtainTileMode() Shader.TileMode.CLAMP) { // 单次绘制模式 canvas.translate(...) canvas.drawRect(...) } else { // 平铺模式 canvas.drawRect(...) } } }水印Shader生成应用支持两种水印模式文字水印和图片水印通过不同的Shader生成策略实现companion object { // 生成文字水印Shader suspend fun buildTextBitmapShader( imageInfo: ImageInfo, config: WaterMark, textPaint: TextPaint, coroutineContext: CoroutineContext ): WaterMarkShader? { // 使用StaticLayout处理多行文本 val staticLayout StaticLayout.Builder.obtain(...).build() // 计算旋转后的尺寸 val fixWidth textWidth * cos(radians) textHeight * sin(radians) val fixHeight textWidth * sin(radians) textHeight * cos(radians) // 创建位图Shader val bitmapShader BitmapShader(bitmap, tileMode, tileMode) } // 生成图片水印Shader suspend fun buildIconBitmapShader( imageInfo: ImageInfo, srcBitmap: Bitmap, config: WaterMark, textPaint: Paint, scale: Boolean, coroutineContext: CoroutineContext ): WaterMarkShader? { // 缩放图片水印 val scaleRatio config.textSize / 14f val targetBitmap Bitmap.createBitmap(...) // 应用旋转和绘制 canvas.rotate(config.degree, ...) canvas.drawBitmap(scaleBitmap, ...) } } 功能面板系统模块化面板设计应用采用模块化的面板设计每个功能都有独立的Fragment文字内容面板-TextContentDisplayFragment.kt颜色选择面板-ColorFragment.kt透明度调节面板-AlphaPbFragment.kt旋转角度面板-DegreePbFragment.kt文字样式面板-TextStyleFragment.kt平铺模式面板-TileModeFragment.kt每个面板都通过BaseBindFragment基类实现确保一致的UI体验和状态管理。数据持久化WaterMarkRepository.kt负责水印配置的持久化存储使用Android DataStore进行轻量级数据存储Singleton class WaterMarkRepository Inject constructor( Named(WaterMarkPreferences) private val dataStore: DataStorePreferences ) { val waterMark: FlowWaterMark dataStore.data .map { WaterMark( text it[KEY_TEXT] ?: 默认水印文本, textSize (it[KEY_TEXT_SIZE] ?: 14f).coerceAtLeast(1f), textColor it[KEY_TEXT_COLOR] ?: Color.parseColor(#FFB800), // ... 其他属性 ) } } 性能优化策略1. 图片加载优化应用使用decodeSampledBitmapFromResource进行图片采样避免内存溢出val inSample calculateInSampleSize( mutableBitmap.width, mutableBitmap.height, WaterMarkImageView.calculateDrawLimitWidth(...), WaterMarkImageView.calculateDrawLimitHeight(...) )2. 协程异步处理所有耗时的图片处理操作都在协程中执行确保UI流畅private suspend fun generateImage(...): ResultUri withContext(Dispatchers.IO) { // 图片处理逻辑 }3. 内存管理使用Bitmap.Config.ARGB_8888确保高质量输出及时回收不再使用的Bitmap对象使用inSampleSize减少内存占用 项目架构总结EasyWatermark采用清晰的架构分层数据层-data/model/和data/repo/WaterMark数据模型Repository数据访问层DataStore持久化存储业务逻辑层-ui/MainViewModel.kt处理图片选择、水印生成管理应用状态和配置协调数据层和UI层UI层-ui/和ui/panel/MainActivity主界面功能面板Fragment自定义视图组件工具层-utils/文件处理工具图片处理工具扩展函数 开发技巧与最佳实践1. 状态管理应用使用StateFlow和LiveData进行响应式状态管理确保UI与数据同步private val _selectedImage MutableStateFlow(ImageInfo.empty()) val selectedImage: StateFlowImageInfo _selectedImage val waterMark: FlowWaterMark dataStore.data .map { preferences - // 映射配置到WaterMark对象 }2. 依赖注入使用Hilt进行依赖注入简化组件管理HiltViewModel class MainViewModel Inject constructor( private val userRepo: UserConfigRepository, private val waterMarkRepo: WaterMarkRepository, private val templateRepo: TemplateRepository ) : ViewModel()3. 错误处理完善的错误处理机制包括内存溢出、文件不存在等情况try { // 图片处理逻辑 } catch (fne: FileNotFoundException) { info.result Result.failure(null, code TYPE_ERROR_FILE_NOT_FOUND) } catch (oom: OutOfMemoryError) { info.result Result.failure(null, code TYPE_ERROR_SAVE_OOM) } 核心功能亮点1. 灵活的平铺模式支持多种Shader.TileModeCLAMP- 边缘拉伸REPEAT- 重复平铺MIRROR- 镜像平铺2. 实时预览水印效果实时预览所有修改立即反映在图片上。3. 批量处理支持多张图片批量添加水印提高工作效率。4. 模板系统内置水印模板系统可以保存常用水印配置。 未来扩展方向基于当前架构EasyWatermark可以轻松扩展以下功能更多水印样式- 支持渐变、阴影等效果AI智能水印- 基于内容的水印位置推荐云端同步- 水印配置云端备份批量导出- 支持多种格式批量导出 学习资源官方文档docs/official.md核心源码app/src/main/java/me/rosuh/easywatermark/UI组件app/src/main/java/me/rosuh/easywatermark/ui/widget/EasyWatermark的架构设计体现了现代Android应用开发的最佳实践通过清晰的层次分离和模块化设计实现了功能丰富且性能优秀的水印应用。无论是学习Android架构设计还是开发类似的应用这个项目都提供了宝贵的参考价值。【免费下载链接】EasyWatermark Securely, easily add a watermark to your sensitive photos. 安全、简单地为你的敏感照片添加水印防止被人泄露、利用项目地址: https://gitcode.com/gh_mirrors/ea/EasyWatermark创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考