EasyAndroid
一系列简单、轻量、方便的Android开发工具集合(持续更新中),包括Android动态权限、SharedPreferences、反射、日志、Toast、Bundle、MVP、线程池、Html、图文混排、蒙层引导、拍照、图库选择等
Install / Use
/learn @easyandroidgroup/EasyAndroidREADME
EasyAndroid 
在平时的开发过程中,我们经常会需要使用到一些基础功能组件,比如Toast,比如Log等。
而这些功能组件,在开发时需要使用到的功能点其实相当有限,所以这也意味着,我们对此类组件的要求是:简单、轻量、易用!相对应的,此类组件的封装库,也应该尽量实现得轻巧精练
EasyAndroid即是专门针对此种需求所设计的一款基础组件集成库
宗旨
1. 设计独立
组件间独立存在,不相互依赖,且若只需要集成库中的部分组件。也可以很方便的
只copy对应的组件文件进行使用
2. 设计轻巧
因为是组件集成库,所以要求每个组件的设计尽量精练、轻巧。避免因为一个小功能而引入大量无用代码.
每个组件的方法数均
不超过100. 大部分组件方法数甚至不超过50。
添加依赖
- 添加jitpack仓库依赖
maven { url 'https://jitpack.io' }
- 添加依赖
implementation "com.github.yjfnypeu:EasyAndroid:$lastest_version"
- 初始化
在Application中调用初识化方法:
EasyAndroid.init(application)
然后即可直接使用
Attention!!!
由于此为轻量组件集成库, 所以框架中包含了多个独立的应用组件提供使用。
但是有的时候,如果你只需要使用框架中的少数或者个别的组件。可以直接copy对应的组件源码文件到工程中去直接使用。
请注意:大部分组件均是完全独立存在的。直接copy源文件即可正常使用。
而部分组件会需要依赖EasyAndroid类。去获取可用的Application Context实例进行使用。对于这部分的组件。
替换内部EasyAndroid.getApplicationContext()为你们项目自身的application context即可。
目录索引
- EasyGuideLayer: 界面蒙层引导组件
- EasySharedPreferences: SharedPreferences存取组件
- EasyDimension: 尺寸转换组件
- EasyFormatter: 数据格式化排版组件
- EasyLog: 日志打印组件
- EasyToast: Toast通知组件
- EasyReflect: 反射操作组件
- EasyActivityResult: onActivityResult解耦组件
- EasyPermissions: 动态权限申请组件
- EasyExecutor: 线程池封装组件
- EasyBundle: Bundle数据存取组件
- EasyMedia: 从拍照、图库进行图片选择组件。
- EasyImageGetter: TextView加载html标签时,提供
img标签的图片加载功能 - MVP: 简单MVP架构
EasyGuideLayer
- 链式调用。调用逻辑清晰直观
- 支持同时设置多个引导层
- 支持高亮区域的自定义绘制
- 支持高亮区域点击监听
- 支持指定任意View设置蒙层引导
- 支持进行蒙层展示、隐藏事件监听
使用示例:
// 创建引导层示例,并为引导层添加指定配置
val item = GuideItem.newInstance(view, padding)
.setLayout(guideLayout)// 设置引导View
.setGravity(Gravity.LEFT)// 设置引导View位置
.setOffsetProvider(provider)// 设置用于进行引导View的位置调整
.setHighLightShape(GuideItem.SHAPE_RECT)// 设置高亮区域绘制模式
.setOnViewAttachedListener(listener)// 设置引导View被添加到蒙层布局中时的通知监听
.setOnDrawHighLightCallback(callback)// 这是自定义高亮块绘制回调
.setOnHighLightClickListener(listener)// 设置高亮点击回调监听
// 创建蒙层实例并绑定引导层,进行展示:
EasyGuideLayer.with(activity)
.setBackgroundColor(color)// 蒙层背景色
.setOnGuideShownListener(lambda)// 蒙层展示、消失监听
.addItem(item)// 绑定引导层实例
.setDismissOnClickOutside(false)// 设置点击到蒙层上的非点击区域时,是否自动让蒙层消失
.setDismissIfNoItems(true)// 设置当蒙层中一个引导层实例都没绑定时,自动让蒙层消失
.show()// 展示蒙层
EasyImageGetter
- 支持设置
placeholde图片加载时占位图 - 支持设置
error图片加载失败时的占位图 - 支持指定uri进行加载。不仅仅局限于网络图片。还包括加载本地图片、assets图片等。
- 支持自定义加载器:满足各种加载需求。
用户实例:
// 提供html文本数据
private val html =
"""
<h5>asset图片加载示例</h5>
<img src="file:///android_asset/imagegetter/cat.png">
<h5>http图片加载示例</h5>
<img src="http://www.w3school.com.cn/i/eg_tulip.jpg">
""".trimIndent()
// 提供展示的TextView控件
private val textView:TextView = getTextView()
EasyImageGetter.create()
// 设置图片加载时的占位图
.setPlaceHolder(R.drawable.placeholder)
// 设置图片加载失败时的占位图
.setError(R.drawable.error)
// 指定加载的html与tv控件即可
.loadHtml(html, textView)
EasyMedia
从图库或者使用相机拍照获取图片的组件。
贡献者:Vicent9920
- 支持链式调用
- 支持图片输出到指定地址
- 支持任意线程选择进行图片选择
用户实例:
val photo = EasyMedia()// 创建EasyMedia实例
// 是否需要进行裁剪
.setCrop(true|false)
// 指定创建的图片地址。
.setImgPath(imgPath:String)
// 通过设置回调,获取选择到的文件
photo.setCallback { file:File ->
// TODO 使用选择的文件进行操作
}
// 当然。不排除出现非预期的问题。所以也提供了错误回调
photo.setError { error:Exception ->
// TODO
}
// 跳转拍照并获取图片
photo.takePhoto(activity)
// 或者跳转图库进行图片选择
photo.selectPhoto(activity)
EasySharedPreferences
使用一个具体的实体类,进行SharedPreferences数据存取
- 通过具体的实体类进行SP数据存储操作。避免
key值硬编码 - 自动同步,即使别的地方是
直接使用SharedPreferences进行赋值,也能自动同步相关数据。 - 打破SharedPreferences限制。支持几乎任意类型数据存取
用法示例:
// 以SharedPreferences文件名为user_info,存储数据为username, age, address为例
// 1. 创建映射实体类
@PreferenceRename("user_info")
class User:PreferenceSupport() {
var username:String
var age:Int
var address:String
}
// 2. 进行读取
val user = EasySharedPreferences.load(User::class.java)
// 3. 进行修改
// 直接使用load出来的user实例进行数值修改
user.age = 16
user.username = "haoge"
// 修改完毕后,apply更新修改到SharedPreferences文件。
user.apply()
EasyDimension
用于灵活的进行设备尺寸单位转换
支持全尺寸数值转换。
用法示例
// 转换10dp到px
EasyDimension.withDIP(10).toPX()
// 转换30sp到MM
EasyDimension.withSP(30).toMM()
EasyFormatter
用于对任意类型数据,进行格式化输出排版,结合log打印组件使用,使log输出展示更清晰
- 支持对
Set/List/Map/JSON/POJO数据进行格式化排版 - 支持最高长度过滤:避免打印超长数据时造成版面浪费
用法示例:
// 创建待格式化数据
val any:Any = create()
// 使用formatter实例进行格式化
val result:String = EasyFormatter.DEFAULT.format(any)
EasyLog
用于简单的进行日志打印输出,支持格式化输出、自定义打印格式。
- 不阻塞:打印任务运行于独立线程中,避免大量打印数据时造成UI阻塞。
- 安全: 对打印任务做好了异常处理。不用担心出现crash问题
- 使用EasyFormatter对任意数据进行格式化排版
- 支持添加自定义规则
- 灵活、直观的进行输出样式定制
- 自动适配TAG. 也可手动指定。
- 使用开关。关闭线上包的日志输出。
- 使用'上边界'逻辑进行栈帧匹配,支持二次封装使用
用法示例:
val any:Any = create()// 创建待打印数据
EasyLog.DEFAULT.d(any)// 使用默认log实例进行数据打印. 以Log.d()的方式进行输出
EasyToast
用于进行Toast提示,可很简单的指定输出样式。
- 支持在任意线程下进行toast提示
- 非常方便的进行任意样式的定制
- 不管当前是否正在展示之前的数据。有新消息通知时,直接展示新消息,无需等待
博客地址:https://juejin.im/post/5b0638336fb9a07aa9261ce6
用法示例:
val message:String = create()// 创建待提示数据
EasyToast.DEFAULT.show(message)// 使用系统样式进行输出
EasyToast.create(layoutID:Int, tvID:Int, duration:Int).show(message)// 使用自定义样式进行输出
EasyReflect
对常规的反射操作进行封装。达到更便于使用反射的效果
博客地址:https://juejin.im/post/5b1de20c6fb9a01e701000cb
用法示例:
// 以类名Test为例
class Test private constructor(private val name:String) {
private fun wrap(name:String):String = "包裹后的数据$name"
}
// 创建Reflect实例:
var reflect = EasyReflect.create(Test::class.java).instance("默认参数")
// 为name字段赋值:
reflect.setField("name", "EasyReflect")
// 读取name字段的值:"EasyReflect"
val value = reflect.getValue("name")
// 调用方法wrap方法,并传入参数value
reflect.call("wrap", value)
// 调用wrap方法,并获取返回值: "包裹后的数据EasyReflect"
val result = reflect.callWithReturn("wrap", value).get<String>()
EasyActivityResult
用于解决onActivityResult业务逻辑臃肿的问题
- 业务解耦分离: 各自启动业务线处理各自的回调逻辑
- 去除requestCode: 进行启动时自动生成随机的requestCode, 不用再为每个启动任务分别配置请求码了。
- 防暴击: 防止快速点击时启动多个重复页面
博客地址:https://juejin.im/post/5b21d019e51d4506d93701ba
用法示例:
EasyActivityResult.startActivity(activity, Intent(activity, DemoActivity::class.java),
{ resultCode:Int, data:Intent? ->
// 直接在此进行返回数据处理
})
EasyPermissions
进行6.0+的动态权限请求
- 链式调用
- 支持定制权限申请说明弹窗
- 支持同时申请多个权限
- 多权限申请时进行去重与空过滤
- 自动使用顶层Activity执行权限请求
- 支持在任意线程进行权限申请
- 当有默认拒绝的权限时,提示用户前往权限设置页。手动开启权限
博客地址:https://juejin.im/post/5b1a2a326fb9a01e5d32f208
用法示例:
EasyPermissions.create(// 指定待申请权限
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.WRITE_CALENDAR,
Manifest.permission.WRITE_CONTACTS
)
// 定制权限申请说明弹窗
.rational { permission, chain ->
AlertDialog.Builder(this)
.setTitle("权限申请说明")
.setMessage("应用需要此权限:\n$permission")
.setNegativeButton("拒绝", {_, _ -> chain.cancel() })
.setPositiveButton("同意", {_, _ -> chain.process() })
.show()
return@rational true
}
// 设置授权结果回调
.callback { grant ->
EasyToast.DEFAULT.show("权限申请${if (grant) "成功" else "失败"}")
}
// 当权限被默认拒绝时。调起弹窗提醒需要用户去主动开启权限
.alwaysDenyNotifier(object : PermissionAlwaysDenyNotifier() {
AlertDialog.Builder(activity)
.
Related Skills
node-connect
347.2kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
108.0kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
347.2kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
347.2kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
