本篇文章是我研究的项目收拾的一些知识点,便利自查,后续会不断收拾旧的内容和添加新的内容,本篇文章也加了一些常用库的地址,便利查找

下划线(“_”)作为数字分隔符

为了便利阅览,数字位数较多的时候,最好运用下划线(“_”)作为数字分隔符

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两根和单根手指旋转

两根手指旋转

旋转检测库

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

贴一下源码:

Android一些项目知识点整理

Kotlin中调集操作符

groupBy

依据分组函数对调集进行分组,回来分组成果 MapMap 中的 key 类型由分组函数决定, value 的类型是 List

groupBy 两个参数的函数会对调集元素的值进行转化,终究添加到 Map

例如我们需求对字符串按长度进行分组,那么 Mapkey 就是 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]]

能够很明显看到mapflatMap的差异,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

Android一些项目知识点整理

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