Android 自定义View测量模式模板笔记

93 阅读1分钟
import android.content.Context
import android.util.AttributeSet
import android.util.Log
import android.view.View

class MeasureView @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {

    companion object{
        const val  TAG  = "MeasureView"
    }

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)

        val specWidthMode = MeasureSpec.getMode(widthMeasureSpec)
        val specWidthSize = MeasureSpec.getSize(widthMeasureSpec)
        when (specWidthMode) {
            MeasureSpec.EXACTLY -> {
                //表示设置了精确的值,一般当View 或 childView设置其宽、高为 : 精确值、match_parent时,会将其设置为EXACTLY。
                Log.i(TAG,"Width EXACTLY")

            }
            MeasureSpec.AT_MOST -> {
                //表示子布局被限制在一个最大值内,一般当View 或 childView设置其宽、高为wrap_content时,会将其设置为AT_MOST。
                Log.i(TAG,"Width AT_MOST")
            }
            MeasureSpec.UNSPECIFIED -> {
                //表示子布局想要多大就多大,一般出现在AadapterView的item的heightMode中、
                // ScrollView的childView的heightMode中;此种模式比较少见。
                Log.i(TAG,"Width UNSPECIFIED")
            }
        }

        val specHeightMode = MeasureSpec.getMode(heightMeasureSpec)
        val specHeightSize = MeasureSpec.getSize(heightMeasureSpec)
        when (specHeightMode) {
            MeasureSpec.EXACTLY -> {
                //表示设置了精确的值,一般当View 或 childView设置其宽、高为 : 精确值、match_parent时,会将其设置为EXACTLY。
                Log.i(TAG,"Height EXACTLY")

            }
            MeasureSpec.AT_MOST -> {
                //表示子布局被限制在一个最大值内,一般当View 或 childView设置其宽、高为wrap_content时,会将其设置为AT_MOST。
                Log.i(TAG,"Height AT_MOST")
            }
            MeasureSpec.UNSPECIFIED -> {
                //表示子布局想要多大就多大,一般出现在AadapterView的item的heightMode中、
                // ScrollView的childView的heightMode中;此种模式比较少见。
                Log.i(TAG,"Height UNSPECIFIED")
            }
        }

        setMeasuredDimension(specWidthSize, specHeightSize)
    }
}
```
```