android view 擴充套件方法

烟花易冷心易碎發表於2024-06-05

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)

相關文章