为了更快捷的开发,为了更简单的开发,为了更快乐的开发,在此封装了控件、组件、常用工具以及有趣的代码。
持续更新中......
allprojects {
repositories {
google()
jcenter()
mavenCentral()
maven { url uri('https://gitee.com/jackeysun/common-kit/raw/master/repo') }
}
}
dependencies {
implementation 'com.uu:util:1.0.7' //常用工具
implementation 'com.uu:common:1.0.9' //通用工具
implementation 'com.uu:widget:1.0.7' //常用控件
}
MarkerViewSpan:配合Span使用,在TextView中添加View
Span.setSpan(
MarkerViewSpan(markerView),
word.start,
word.end,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)
CenterImageSpan:自定义的ImageSpan(默认ImageSpan图片不与文字垂直方向对其)
AbsPopupWindow:悬浮窗基础类
SelectableTextView:选择单词的TextView,可在其中添加悬浮窗和选中字体的属性修改
var selectionInfo: SelectionInfo = SelectionInfo()//选中单词的背景色
var floatWindow: IFloatWindow? = SimplePopupWindow(context)//悬浮窗,可自己定义悬浮窗(继承AbsPopupWindow赋值给他即可)
data class SelectionInfo(
var mSpan: Any? = null,
var mStart: Int = 0,
var mEnd: Int = 0,
var mSpannable: Spannable? = null,
var backgroundColor: Int = Color.parseColor("#4DFED400")
)
该View中提供以上两个属性
<com.jackeysun.common.text.SelectableTextView
android:id="@+id/tv2"
android:layout_width="match_parent"
android:background="@color/white"
android:layout_height="match_parent" />
SelectCallbackTextView: 继承至SelectableTextView,提供了接口
interface OnSelectListener{
fun onSelected(selectText: CharSequence?)
}
音视频播放控件
<uses-permission android:name="android.permission.INTERNET" />//网络权限
<com.jackeysun.widget.media.AudioView
android:id="@+id/av"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
mainBinding.av.path = DataSource.mp3//这是资源
mainBinding.av.speeds = mutableListOf(1.0f, 1.1f,1.2f)//这是倍数播放
IData,AbsAdapter,AbsViewHolder:增加item中view的点击事件处理addClickId(id)
class MainActivity2 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val main2Binding = ActivityMain2Binding.inflate(layoutInflater)
setContentView(main2Binding.root)
val adapter = AbsAdapter<TestData> {adapter, view, position ->
when (view.id) {
R.id.tv -> {
Toast.makeText(MainActivity2@this, "${adapter.getItem(position).content}",
Toast.LENGTH_SHORT).show()
}
R.id.tv2 -> {
Toast.makeText(MainActivity2@this, "${adapter.getItem(position).content}",
Toast.LENGTH_SHORT).show()
}
}
}
// val adapter = AbsAdapter<TestData>()
adapter.addLayout(0, R.layout.item_view0)
adapter.addLayout(1, R.layout.item_view1)
adapter.addClickId(R.id.tv)
adapter.addClickId(R.id.tv2)
val datas = mutableListOf<TestData>()
for (i in 0..100) {
datas.add(TestData("第${i}项", if (i % 2 == 0) 0 else 1))
}
adapter.data = datas
main2Binding.rv.adapter = adapter
main2Binding.rv.layoutManager = LinearLayoutManager(this)
}
}
class TestData(val content: String, private val type: Int) : IData {
override fun getType(): Int {
return type
}
override fun bind(holder: RecyclerView.ViewHolder) {
when (type) {
0 -> {
val mBinding = ItemView0Binding.bind(holder.itemView)
mBinding.tv.text = content
}
1 -> {
val mBinding = ItemView1Binding.bind(holder.itemView)
mBinding.tv2.text = content
}
}
}
}
SpExt:SharedPreferences工具(增加get方法,可自动判断获得数据类型,根据默认值判断类型)
Storage.put("key1", "string")
Storage.put("key2", 0)
val a1: String = Storage.get("key1", "ssss")
val a2: Int = Storage.get("key2", 0)
Ext:
随机数工具--新增(左闭右开区间)
println(Random().random(3, 4))//[3,3+4)
println(3.randomTo(100))//[3,100)
gson解析工具--新增
fun main() {
val list = mutableListOf<Data>()
for (i in 0..10) {
list.add(Data("$i", i, Date()))
}
val data = Data("ssss", 19, Date())
println(list.toJson())
println(list.toJson().toObject<List<Data>>())
println(data.toJson { GSON })
println(data.toJson { GSON }.toObject<Data> { GSON })
}
data class Data(val string: String, val int: Int, val date: Date)
Ext:扩展工具
扩展函数go:用于跳转Activity
go(MainActivity2())
go(MainActivity2()) { i: Intent ->
}
StringExt:字符串处理工具(提供字体样式,字体大小,字体颜色,背景色以及其他属性扩展方法)
Span.addSection("我已阅读并同意")
.addStyleSection(
"《用户注销协议》",
Color.WHITE,
24,
Color.BLUE,
Typeface.BOLD
).into(main3Binding.tv)
ClockView:时钟控件(布局中引用即可使用)
BitmapExt:bitmap处理工具
DateExt:日期工具
println(Date().format("E"))
println("2021-11-20 10:07:24".toDate("yyyy-MM-dd HH:mm:ss"))
val calendar = Calendar.getInstance()
calendar.set(2026,0,27,15,2,59)
println(calendar.time.format("E"))
println("天数:${calendar.time.toDays()}")
println("时数:${calendar.time.toHours()}")
println("分数:${calendar.time.toMinutes()}")
println("秒数:${calendar.time.toSeconds()}")
println("年:${calendar.time.getYEAR()}")
println("月:${calendar.time.getMONTH()}")
println("日:${calendar.time.getDayOfMonth()}")
println("时:${calendar.time.getHour()}")
println("分:${calendar.time.getMinute()}")
println("秒:${calendar.time.getSecond()}")
println("一年中第几天:${calendar.time.getDayOfYear()}")
println("一周中第几天:${calendar.time.getDayOfWeek()}")
println("一月中第几周:${calendar.time.getWeekOfMonth()}")
Display:屏幕显示相关工具
DividerItemDecoration:RecyclerView间距工具
FileExt:文件处理工具
KeyboardExt:键盘工具
SpExt:SharedPreferences工具(增加get方法,可自动判断获得数据类型,根据默认值判断类型)
ToastExt:Toast工具
IData,AbsAdapter,AbsViewHolder:RecyclerView封装
class MainActivity2 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val main2Binding = ActivityMain2Binding.inflate(layoutInflater)
setContentView(main2Binding.root)
val adapter = TestAdapter()
adapter.layoutIds[0] = R.layout.item_view0
adapter.layoutIds[1] = R.layout.item_view1
val datas = mutableListOf<TestData>()
for (i in 0..100) {
datas.add(TestData("第${i}项", if (i % 2 == 0) 0 else 1))
}
adapter.data = datas
main2Binding.rv.adapter = adapter
main2Binding.rv.layoutManager = LinearLayoutManager(this)
}
}
class TestData(private val content: String, private val type: Int) : IData<AbsViewHolder> {
override fun getType(): Int {
return type
}
override fun bind(holder: AbsViewHolder) {
val tv: TextView = holder.mRootView.findViewById(R.id.tv)
tv.text = content
}
}
class TestAdapter : AbsAdapter<TestData>()
ActivityManager:activity管理类
DialogFragmentShowPic:图片显示弹窗
Ext:扩展工具(富文本显示等等)
CircleDrawable,CircleProgressDrawable:圆形圆圈
ClearEditText:带清空的输入框
LoadingDialog:加载dialog
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。