美文网首页
超好用的官方core-ktx库,了解一下~

超好用的官方core-ktx库,了解一下~

作者: super可乐 | 来源:发表于2022-09-22 11:19 被阅读0次

    本文是研究官方core-ktx库的第四篇文章,旨在探究该库中有哪些工具类或方法能够提高我们的开发效率。

    已更新的系列文章:

    你需要了解的官方core-ktx库能对开发带来哪些便利1

    官方core-ktx库能对富文本Span开发带来哪些便利?

    官方core-ktx库能对SparseArray系列、Pair开发带来哪些便利?

    本篇文章主要是研究core-ktx库中graphics包下提供的关于View绘制、BitmapRectColor等操作的一系列扩展API,看看能为我们开发带来哪些便利。

    DrawableBitmap相互间转换

    Bitmap.toDrawable(Resource)实现BitmapDrawable

    Bitmap定义了一个快速转换成BitmapDrawable的扩展方法,还是少写了一些模板代码的。

    Drawable.toBitmap()实现Drawable转换成Bitmap对象

    Drawable转换成Bitmap应该是我们日常开发中常见的场景,这里官方库直接给我们提供了一个toBitmap()的API,非常的方便,下面我们来简单介绍下其中的原理:

    1. 首先判断当前Drawable的类型是否为BitmapDrawable,如果是直接调用其getBitmap()就能直接拿到Bitmap对象,然后根据传入的宽高进行一定比例的压缩转换后进行返回;

    2. 如果不是BitmapDrawable,就首先需要创建一个Bitmap对象,可以理解为一个"画布",然后接着创建一个Canvas对象并传入之前创建的Bitmap对象,这样我们就可以利用Canvas提供的绘制API在Bitmap这个"画布"上作画了,接下来直接调用Drawable的draw()方法并传入Canvas,就可以将Drawable中的显示内容绘制到我们一开始创建的Bitmap上了,这样就完成了DrawableBitmap的转换

    Bitmap系列

    简化对Bitmap的绘制操作

    我们先看下日常开发中,我们怎么在Bitmap中绘制一点东西:

    private fun test4(bitmap: Bitmap) {
        val canvas = Canvas(bitmap)
        canvas.apply { 
            //进行一些绘制操作
            drawLine(0f, 0f, 100f, 100f, Paint())
        }
    }
    

    有些繁琐,看下官方库给我们提供了什么便利的扩展实现:

    帮助我们创建好Canvas对象,并且方法参数是一个接收者为Canvas的函数类型,这意味我们可以直接在外部传入的lambda中进行绘制操作:

    private fun test4(bitmap: Bitmap) {
        bitmap.applyCanvas {
            //进行一些绘制操作
            drawLine(0f, 0f, 100f, 100f, Paint())
        }
    }
    

    简化Bitmap创建

    1.createBitmap()创建指定大小和像素格式的Bitmap

    还是简化了创建Bitmap的操作,虽然很小。

    2.scale()缩放(压缩)Bitmap

    这个也是我们常用的通过降低分辨率压缩Bitmap大小的一种方式。

    操作Bitmap中的像素点

    1.Bitmap.get(x: Int, y: Int)获取指定位置的像素点RGB值

    经典的运算符重载函数,代码中可以直接val pointRGB = bitmap[100, 100]使用。

    2.Bitmap.set()设置某个点的RGB像素值

    同样也是个运算符重载方法,代码中直接bitmap[100, 100] = Color.RED使用。

    3.Bitmap.contains()判断指定位置点是否落在Bitmap

    运算符重载方法,直接Point(100, 100) in bitmap使用

    color系列

    普通扩展属性获取颜色的A、R、G、B

    使用如下:

    private fun test10(@ColorInt value: Int) {
        val a = value.alpha
        val r = value.red
        val g = value.green
        val b = value.blue
    }
    

    解构获取颜色的A、R、G、B

    带有operator修饰componenX就是解构方法,X和参数声明的位置一一对应:

    private fun test10(@ColorInt value: Int) {
        val (a, r, g, b) = value
    }
    

    向我们常见的data classHashMap都实现了类似的解扩展。

    转换颜色Color对象

    1.Int.toColor()整形颜色转换Color对象

    2.String.toColorInt()实现字符串转Color对象

    这个应该比较常用,直接"#ffffff".toColorInt()即可

    Rect系列

    解构获取左、上、右、下的值

    熟悉的解构,使用和上面一样(RectF也同样提供了相同的解构方法),如下:

    private fun test10(rect: Rect) {
        val (left, top, right, bottom) = rect
    }
    

    缩放Rect范围

    下面是扩充Rect范围的API:

    使用如下:

    private fun test10(rect: Rect) {
        val rect1 = rect + rect
        val rect2 = rect + 10
        val rect3 = rect + Point(100, 200)
    }
    

    同样也提供了minus()缩减Rect范围

    Rect间取交集、并集等

    判断某个点是否落在Rect

    使用:Point(11, 11) in rect

    Point、PointX系列

    下面的扩展方法无非就是解构、通过运算符重载控制Point位置,上面已经讲了一大堆这样的使用,大家走马观花的看下就行,有个印象即可。

    经典的解构取值方法

    操作Point的位置

    总结

    上面的内容已经把graphics包下提供的扩展工具讲的七七八八了,大家主要是有个印象就行,使用的时候能想起来用更好,如果需要详细了解的请直接参考该包下的源码即可。

    关于探索官方core-ktx库的还剩下大概最后一篇文章讲解了,希望可以在这个系列中带给大家一些帮助,提供大家的开发效率。并且通过学习官方库中的封装思路,也同样会给大家日常开发中小优化带来启发。

    作者:长安皈故里
    链接:https://juejin.cn/post/7121718556546482190

    相关文章

      网友评论

          本文标题:超好用的官方core-ktx库,了解一下~

          本文链接:https://www.haomeiwen.com/subject/wnswortx.html