Kotlin實戰指南十一:擴展函數

轉載請標明出處:https://blog.csdn.net/zhaoyanjun6/article/details/94640013
本文出自【趙彥軍的博客】


擴展函數是Kotlin提供的非常酷的特性,在編寫Android應用程序時,你將發現自己會大量使用它。

我們必須承認Android框架有時做些事有點困難,在Java中我們唯一的解決方案是把我們要做事封裝起來,或利用可讀性差的類靜態方法。

你想怎樣才能加額外函數到框架類?這就是Kotlin擴展函數允許我們做的。

在Android中我們要顯示和隱藏一個 view ,通常這樣做:

class MainActivity : AppCompatActivity() {

    private var tv: TextView? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        tv = findViewById(R.id.tv)
        tv?.visibility = View.VISIBLE  //view顯示
        tv?.visibility = View.GONE   //view隱藏

    }
}

那麼用擴展函數怎麼做,我們首先對 View擴展兩個方法

//擴展函數,view隱藏
fun View.gone() {
        visibility = View.GONE
}

//擴展函數,view顯示
fun View.visible() {
        visibility = View.VISIBLE
}

使用:

class MainActivity : AppCompatActivity() {

    private var tv: TextView? = null

    //擴展函數,view隱藏
    fun View.gone() {
        visibility = View.GONE
    }

    //擴展函數,view顯示
    fun View.visible() {
        visibility = View.VISIBLE
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        tv = findViewById(R.id.tv)
        tv?.visible()  //view顯示
        tv?.gone()   //view隱藏

    }
}

一些常用的擴展函數

我們對一些可能會用到的擴展函數做了一個整理:

ViewExtends.kt 對 View 的擴展

import android.view.View

fun View.gone() {
    visibility = View.GONE
}

fun View.visible() {
    visibility = View.VISIBLE
}

var View.topMargin: Int
    get():Int {
        return (layoutParams as ViewGroup.MarginLayoutParams).topMargin
    }
    set(value) {
        (layoutParams as ViewGroup.MarginLayoutParams).topMargin = value
    }

var View.bottomMargin: Int
    get():Int {
        return (layoutParams as ViewGroup.MarginLayoutParams).bottomMargin
    }
    set(value) {
        (layoutParams as ViewGroup.MarginLayoutParams).bottomMargin = value
    }

var View.rightMargin: Int
    get():Int {
        return (layoutParams as ViewGroup.MarginLayoutParams).rightMargin
    }
    set(value) {
        (layoutParams as ViewGroup.MarginLayoutParams).rightMargin = value
    }

var View.leftMargin: Int
    get():Int {
        return (layoutParams as ViewGroup.MarginLayoutParams).leftMargin
    }
    set(value) {
        (layoutParams as ViewGroup.MarginLayoutParams).leftMargin = value
    }

TextViewExtends.kt 對 TextView 的擴展

import android.widget.TextView

/**
 * 設置顏色直接使用colors.xml中定義的顏色即可
 */
fun TextView.setColor(resId: Int) {
    this.setTextColor(resources.getColor(resId))
}

fun TextView.setDrawableLeft(resId: Int) {
    var drawable = this.context.resources.getDrawable(resId)
    drawable.setBounds(0, 0, drawable.minimumWidth, drawable.minimumHeight)
    this.setCompoundDrawables(drawable, null, null, null)
}

fun TextView.setDrawableRight(resId: Int) {
    var drawable = this.context.resources.getDrawable(resId)
    drawable.setBounds(0, 0, drawable.minimumWidth, drawable.minimumHeight)
    this.setCompoundDrawables(null, null, drawable, null)
}

fun TextView.setDrawableTop(resId: Int) {
    var drawable = this.context.resources.getDrawable(resId)
    drawable.setBounds(0, 0, drawable.minimumWidth, drawable.minimumHeight)
    this.setCompoundDrawables(null, drawable, null, null)
}

fun TextView.setDrawableBottom(resId: Int) {
    var drawable = this.context.resources.getDrawable(resId)
    drawable.setBounds(0, 0, drawable.minimumWidth, drawable.minimumHeight)
    this.setCompoundDrawables(null, null, null, drawable)
}

ContextExtends.kt 對Context的擴展

import android.content.Context
import android.view.Gravity
import android.widget.Toast

//----------toast----------
fun Context.toast(text: CharSequence, duration: Int = Toast.LENGTH_SHORT) {
    Toast.makeText(this, text, duration).show()
}

fun Context.toast(resId: Int, duration: Int = Toast.LENGTH_SHORT) {
    Toast.makeText(this, resId, duration).show()
}

fun Context.centerToast(resId: Int, duration: Int = Toast.LENGTH_SHORT) {
    var t = Toast.makeText(this, resId, duration)
    t.setGravity(Gravity.CENTER, 0, 0)
    t.show()
}

//----------尺寸轉換----------

fun Context.dp2px(dpValue: Float): Int {
    val scale = resources.displayMetrics.density
    return (dpValue * scale + 0.5f).toInt()
}

fun Context.px2dp(pxValue: Float): Int {
    val scale = resources.displayMetrics.density
    return (pxValue / scale + 0.5f).toInt()
}

fun Context.sp2px(spValue: Float): Int {
    val scale = resources.displayMetrics.scaledDensity
    return (spValue * scale + 0.5f).toInt()
}

fun Context.px2sp(pxValue: Float): Int {
    val scale = resources.displayMetrics.scaledDensity
    return (pxValue / scale + 0.5f).toInt()
}

總結

我在github 上找了一個常用的擴展庫,大家可以看看,非常有用。https://github.com/shiweibsw/Android-kotlin-extend-utils


個人微信號:zhaoyanjun125 , 歡迎關注

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章