本篇文章是我研究的项目收拾的一些知识点,便利自查,后续会不断收拾旧的内容和添加新的内容,本篇文章也加了一些常用库的地址,便利查找
下划线(“_”)作为数字分隔符
为了便利阅览,数字位数较多的时候,最好运用下划线(“_”)作为数字分隔符
1000000能够用1_000_000表明,1_000_000能够更好的阅览
留意:这仅仅进步可读性,但这不是必须的,也不影响代码的功用
RecyclerView运用ListAdapter
RecyclerView在频频的增修正查操作时建议运用ListAdapter
ListAdapter是RecyclerView.Adapter的子类
相比较RecyclerView.Adapter来说,ListAdapter供给了以下优点:
- 主动核算列表项的差异,然后更高效地更新列表
- 内置数据调集,能够更便利地对列表数据进行操作
- 支撑异步数据加载和主动更新列表
总之,假如需求对列表数据进行频频的增修正查操作,运用ListAdapter会愈加便利和高效。
LinearLayout动画
android:animateLayoutChanges="true"
xml中加个这个特点能够打开LinearLayout自带的动画
ScaleGestureDetector的缩放抖动问题
onScale(detector: ScaleGestureDetector)办法中,return false
detector会在之前的缩放上继续进行核算,就能够防止抖动
class ScaleListener: ScaleGestureDetector.SimpleOnScaleGestureListener() {
private var scaleFactor = 1.0f // 初始缩放比例为 1.0
/**
* 缩放进行中,回来值表明是否下次缩放需求重置,
* 假如回来ture,那么detector就会重置缩放事情,假如回来false,detector会在之前的缩放上继续进行核算
*/
override fun onScale(detector: ScaleGestureDetector): Boolean {
scaleFactor *= detector.scaleFactor
scaleFactor = max(0.5f, min(scaleFactor, 2f)) // 设置最大和最小缩放比例
this@BaseLayout.scaleY = scaleFactor
this@BaseLayout.scaleX = scaleFactor
//return true的话,缩放会呈现抖动
return false
}
/**
* 缩放开端,回来值表明是否受理后续的缩放事情
*/
override fun onScaleBegin(detector: ScaleGestureDetector): Boolean {
return true
}
override fun onScaleEnd(detector: ScaleGestureDetector) {
}
}
Android两根和单根手指旋转
两根手指旋转
旋转检测库
单根手指旋转
private var degree = 0f
private var oriX = 0f
private var oriY = 0f
//留意这里取的都是event.x不是event.rawX
override fun onTouchEvent(event: MotionEvent): Boolean {
when (event.actionMasked) {
MotionEvent.ACTION_DOWN -> {
oriX = event.x
oriY = event.y
degree = rotation
}
MotionEvent.ACTION_MOVE -> {
val tempRawX = event.x
val tempRawY = event.y
val first = Point(oriX.toInt(), oriY.toInt())
val second = Point(tempRawX.toInt(), tempRawY.toInt())
val cen = Point( width/2, height/2)
//旋转
degree += angle(cen,first,second)
rotation = degree
}
MotionEvent.ACTION_UP -> {}
else -> {}
}
return true
}
//获取角度
private fun angle(cen: Point, first: Point, second: Point): Float {
val dx1: Float = (first.x - cen.x).toFloat()
val dy1: Float = (first.y - cen.y).toFloat()
val dx2: Float = (second.x - cen.x).toFloat()
val dy2: Float = (second.y - cen.y).toFloat()
// 核算三边的平方
val ab2 =
((second.x - first.x) * (second.x - first.x) + (second.y - first.y) * (second.y - first.y)).toFloat()
val oa2 = dx1 * dx1 + dy1 * dy1
val ob2 = dx2 * dx2 + dy2 * dy2
// 依据两向量的叉乘来判别顺逆时针
val isClockwise =
(first.x - cen.x) * (second.y - cen.y) - (first.y - cen.y) * (second.x - cen.x) > 0
// 依据余弦定理核算旋转角的余弦值
var cosDegree =
(oa2 + ob2 - ab2) / (2 * Math.sqrt(oa2.toDouble()) * Math.sqrt(ob2.toDouble()))
// 反常处理,因为算出来会有差错绝对值可能会超过一,所以需求处理一下
if (cosDegree > 1) {
cosDegree = 1.0
} else if (cosDegree < -1) {
cosDegree = -1.0
}
// 核算弧度
val radian = acos(cosDegree)
// 核算旋转过的角度,顺时针为正,逆时针为负
return (if (isClockwise) Math.toDegrees(radian) else -Math.toDegrees(radian)).toFloat()
}
XML中标签的运用,导致布局错乱
在Android Studio中,标签的运用,导致布局预览的时候,界面显示错乱,这时我们能够用tools:parentTag="自己界说的布局"
,能够防止因运用<merge>
标签导致的布局排列错乱问题,同时能够在预览中查看自界说布局作用
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
tools:parentTag="com.xx.xx.xx.RulerLayout"
android:layout_height="wrap_content">
</merge>
多线程AtomicInteger
在Kotlin中,AtomicInteger是一种特殊的数据类型,它能够确保多个线程对它进行操作时的原子性。这意味着AtomicInteger的值能够在多个线程之间安全地同享和修正,而不必担心竞态条件或数据不一致的问题
多线程CountDownLatch
在Java中,CountDownLatch是一种同步东西类,它能够让一个或多个线程等候其他线程完结操作后再履行。CountDownLatch通过一个计数器来完成这个功用,计数器的初始值能够通过结构函数来指定,当计数器的值为0时,等候线程将会被唤醒继续履行。CountDownLatch通常用于协调多个线程之间的操作,以确保它们依照预期的次序履行
假如你想快速完成多任务的并发分合战略,CountDownLatch会是一个不错的挑选,而且它是官方帮你封装好的
Kotlin中自界说View
在结构函数中需求加@JvmOverloads constructor
例如:
class GuidingPrinciple@JvmOverloads constructor(context: Context?, attrs: AttributeSet? = null, defStyleAttr: Int = 0) :
View(context, attrs, defStyleAttr) {
}
Kotlin中List可用+替代add
一开端看他人代码,有点懵,后边查了材料才发现,kotlin中能够用+替代调集的add办法
val stringList = ArrayList<String>()
val name = "John"
//下面这句同等与stringList.add(name)
stringList + name
贴一下源码:
Kotlin中调集操作符
groupBy
依据分组函数对调集进行分组,回来分组成果 Map
,Map
中的 key
类型由分组函数决定, value
的类型是 List
groupBy
两个参数的函数会对调集元素的值进行转化,终究添加到 Map
中
例如我们需求对字符串按长度进行分组,那么 Map
中 key
就是 Int
类型
val company = listOf("Google", "Microsoft", "IBM", "Apple", "Yahoo", "Alibaba", "Baidu")
// {6=[Google], 9=[Microsoft], 3=[IBM], 5=[Apple, Yahoo, Baidu], 7=[Alibaba]}
println(company.groupBy { it.length })Baidu], 7=[Alibaba]}
// 两个参数,给元素添加个_下标
// {6=[Google_], 9=[Microsoft_], 3=[IBM_], 5=[Apple_, Yahoo_, Baidu_], 7=[Alibaba_]}
println(company.groupBy({ it.length },{ it + "_" }))
flatMap
将调集中的元素依据转化函数得到新的值,而且将一切值铺平到新的调集中。与map
不同的是,flatMap
的转化函数需求回来一个新的调集,而且会将转化后的值都铺平到调集中,所以假如有嵌套的调集转化成单层的调集时请运用flatMap
val intList = listOf(1, 2, 3, 4, 5)
val nestList = listOf(listOf(1, 2), listOf(3, 4), listOf(5, 6, 7))
println(intList.flatMap { listOf(it + it, it * it, it * it * it) }) // [2, 1, 1, 4, 4, 8, 6, 9, 27, 8, 16, 64, 10, 25, 125]
println(nestList.flatMap { item -> item.map { it * it } }) // [1, 4, 9, 16, 25, 36, 49]
map
依据转化函数进行转化元素,得到一个包括一切转化之后的元素的List
val intList = listOf(1, 2, 3, 4, 5)
val nestList = listOf(listOf(1, 2), listOf(3, 4), listOf(5, 6, 7))
println(intList.map { it * it }) // [1, 4, 9, 16, 25]
println(nestList.map { item -> item.map { it * it } }) // [[1, 4], [9, 16], [25, 36, 49]]
能够很明显看到map
和flatMap
的差异,flatMap
会铺平整个调集,而map
仅仅将转化元素累计
indexOfFirst
indexOfFirst()是Kotlin标准库中的一个函数,它能够用于查找满意指定条件的第一个元素的索引。它接纳一个Lambda表达式作为参数,该表达式接纳一个元素作为输入,并回来一个布尔值,表明该元素是否满意条件。假如存在满意条件的元素,则回来该元素的索引;否则回来-1。
开源库
AndroidUtilCode
// if u use AndroidX, use the following
implementation 'com.blankj:utilcodex:1.31.1'
// Not in maintenance
implementation 'com.blankj:utilcode:1.30.7'
地址:
AndroidUtilCode
Glide
implementation 'com.github.bumptech.glide:glide:4.16.0'
地址:
bumptech/glide
单RecyclerView完成抖音二级谈论
地址:
blackfrogxxoo/CommentDemo: 单RecyclerView简略完成的二级谈论功用。 (github.com)
富文本编辑器
地址:
chinalwb/Android-Rich-text-Editor
Android 资源库
地址:
ColorfulCat/AndroidLibs:正在成为史上最全分类 Android 开源大全)
图片挑选器
地址:
LuckSiege/PictureSelector: Picture Selector Library for Android or 图片挑选器 (github.com)
FrameWork教程
地址:
yuandaimaahao/AndroidFrameworkTutorial: 写给使用开发的 Android Framework 教程
AOSP生成体系签名
地址:
getfatday/keytool-importkeypair: A shell script to import key/certificate pairs into an existing Java keystore
Google机器学习套件
地址:
机器学习套件 | ML Kit | Google for Developers
RxTool
dependencies {
//基础东西库
implementation 'com.github.tamsiree.RxTool:RxKit:2.6.3'
//UI库
implementation 'com.github.tamsiree.RxTool:RxUI:2.6.3'
//相机库
implementation 'com.github.tamsiree.RxTool:RxCamera:2.6.3'
//功用库(Zxing扫描与生成二维码条形码)
implementation 'com.github.tamsiree.RxTool:RxFeature:2.6.3'
//ArcGis For Android东西库(API:100.1以上版本)
implementation 'com.github.tamsiree.RxTool:RxArcGisKit:2.6.3'
//付出模块(付出宝 微信)[暂为待优化模块,谨慎]
implementation 'com.github.tamsiree.RxTool:RxPay:2.6.3'
}
作用:
东西类调集 | 付出宝付出 | 微信付出(一致下单) | 微信分享 | Zip4j压缩(支撑分卷压缩与加密) | 一键集成UCrop挑选圆形头像 | 一键集成二维码和条形码的扫描与生成 | 常用Dialog | WebView的封装可播放视频 | 仿斗鱼滑动验证码 | Toast封装 | 震动 | GPS | Location定位 | 图片缩放 | Exif 图片添加地理位置信息(经纬度) | 蛛网等级 | 色彩挑选器 | ArcGis | VTPK
地址:
Tamsiree/RxTool
GSYVideoPlayer
地址:
CarGuo/GSYVideoPlayer