扩展函数
扩展类的函数, 即Extension Function, 可以在已有类中添加新的方法, 比继承更加简洁和优雅.
扩展View的dp转换函数.
// 使用扩展函数
fun View.dp_f(dp: Float): Float {
// 引用View的context
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, dp, context.resources.displayMetrics)
}
// 转换Int
fun View.dp_i(dp: Float): Int {
return dp_f(dp).toInt()
}
使用扩展函数:
// 设置属性
v {
layoutParams = LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)
text = "Hello"
setTextColor(ContextCompat.getColor(applicationContext, R.color.colorAccent))
padLeft = dp_i(20.0f);
}
扩展属性
扩展属性, 即Extension Property, 即把某些函数添加为数据, 使用”=”, 直接设置或使用.
设置View的padLeft属性.
// 使用扩展属性(extension property)
var View.padLeft: Int
set(value) {
setPadding(value, paddingTop, paddingRight, paddingBottom)
}
get() {
return paddingLeft
}
综合例子:
fun String.times(times: Int): String {
var builder = StringBuilder()
for (i in 0 until times) {
// 这里的this只得调用者本身
builder.append(this)
}
return builder.toString()
}
var String.name:String
set(v){}
get() = "123"
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
testValVar()
}
fun testValVar() {
// test即为上面提到的调用者
Log.d("thz","test".times(20))
var str = "tewt"
Log.d("thz",str.name)
}
}
打印结果为:
: testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest
: 123