测量分两步:
第一步,获取测量模式和尺寸
// 获取测量模式和尺寸
val mode = MeasureSpec.getMode(widthMeasureSpec)
val size = MeasureSpec.getSize(widthMeasureSpec)
第二步,根据测量模式分别测量尺寸
// 根据不同测量模式分别测量
when (mode) {
MeasureSpec.EXACTLY -> {
result = size
}
MeasureSpec.AT_MOST -> {
result = 200
result = Math.min(result, size)
}
MeasureSpec.UNSPECIFIED -> {
result = 200
}
}
测量模式:
测量模式
完整代码:
package com.gorhaf.lab
import android.content.Context
import android.util.AttributeSet
import android.util.Log
import android.view.View
class CustomView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
private val TAG = "CustomView"
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
setMeasuredDimension(
measureWidth(widthMeasureSpec),
measureHeight(heightMeasureSpec)
)
}
private fun measureWidth(widthMeasureSpec: Int): Int {
// 默认大小
var result = 0
// 获取测量模式和尺寸
val mode = MeasureSpec.getMode(widthMeasureSpec)
val size = MeasureSpec.getSize(widthMeasureSpec)
// 根据不同测量模式分别测量
when (mode) {
MeasureSpec.EXACTLY -> {
result = size
}
MeasureSpec.AT_MOST -> {
result = 200
result = Math.min(result, size)
}
MeasureSpec.UNSPECIFIED -> {
result = 200
}
}
return result
}
private fun measureHeight(heightMeasureSpec: Int): Int {
// 默认大小
var result = 0
// 获取测量模式和尺寸
val mode = MeasureSpec.getMode(heightMeasureSpec)
val size = MeasureSpec.getSize(heightMeasureSpec)
// 根据不同测量模式来测量
when (mode) {
MeasureSpec.EXACTLY -> {
result = size
}
MeasureSpec.AT_MOST -> {
result = 200
result = Math.min(result, size)
}
MeasureSpec.UNSPECIFIED -> {
result = 200
}
}
// 返回大小
return result
}
}