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)