android view 扩展方法
import android.view.View
import android.view.ViewGroup
import android.view.ViewGroup.MarginLayoutParams
import android.view.ViewTreeObserver
import androidx.core.view.marginBottom
import androidx.core.view.marginLeft
import androidx.core.view.marginRight
import androidx.core.view.marginTop
/**
- 绘制之前调用
- 返回值onPreDraw:是否继续绘制,修改宽高的等需要返回false
- ViewTreeObserver.OnPreDrawListener 的返回值是一个布尔值。
- 如果返回 true,则表示绘制事件会继续进行;
- 如果返回 false,则表示绘制事件会被取消,视图树将不会绘制。
*通过返回 false,你可以在视图树绘制之前进行一些操作,例如修改视图的属性或者执行一些动画效果。 - 如果你需要在绘制之前做一些准备工作或者对绘制进行干预,可以使用 ViewTreeObserver.OnPreDrawListener 来实现。
*/
inline fun View.onPreDrawListener(crossinline onPreDraw: ((View) -> Boolean)) {
val mPreDraw = object : ViewTreeObserver.OnPreDrawListener {
override fun onPreDraw(): Boolean {
viewTreeObserver.removeOnPreDrawListener(this)
return onPreDraw.invoke(this@onPreDrawListener)
}
}
viewTreeObserver.addOnPreDrawListener(mPreDraw)
}
inline fun View.onGlobalLayoutListener(crossinline doGlobalLayout: ((View) -> Unit)) {
val mGlobalLayout = object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
viewTreeObserver.removeOnGlobalLayoutListener(this)
doGlobalLayout.invoke(this@onGlobalLayoutListener)
}
}
viewTreeObserver.addOnGlobalLayoutListener(mGlobalLayout)
}
/**
- view 设置margin
*/
inline fun View.setMargins(left: Int=marginLeft, top: Int=marginTop, right: Int=marginRight, bottom: Int=marginBottom): View {
val tmp = layoutParams
if (tmp is MarginLayoutParams) {
tmp.setMargins(left, top, right, bottom)
}
return this
}
/**
- view 设置margin
*/
inline fun View.removeParent() = getParentView()?.removeView(this)
/**
- view 设置margin
*/
inline fun View?.getParentView(): ViewGroup? = (this?.parent as? ViewGroup)
fun View.androidContent(): View =rootView.findViewById(android.R.id.content)
//val View.parentView: ViewGroup? get()= (this?.parent as? ViewGroup)