本文所要叙述的是自定义View(不带子view)的尺寸的控制。
最基本的要求
- 能够响应xml里对尺寸的设置
- 能满足自己的特征(比如view的特征是一个正方形,但是xml里设置的宽和高却不一样)
案例就实现一个正方形的头像显示框!
一、显示头像图片
直接创建一个AppCompatImageView
的子类就好,我命名为SquareImageView
class SquareImageView(context: Context, attrs: AttributeSet?) : AppCompatImageView(context, attrs) {
}
二、正方形
正方形的宽
等于高
在自定义view中有两个位置都可以对view的尺寸进行设置
layout
//在layout设置尺寸的弊端是,父view并不知道我们的修改。所以最终的布局效果很可能不是我们想要的
override fun layout(l: Int, t: Int, r: Int, b: Int) {
//宽和高取min,来设置
var size = min(r-l, b-t)
super.layout(l, t, l + size, t + size)
}
onMeasure
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
//获取测量的尺寸
var size = min(measuredWidth, measuredHeight)
//设置修改后的尺寸
setMeasuredDimension(size, size)
//测量的尺寸
//getMeasuredWidth()
//getMeasuredHeight()
//父view给定的尺寸计算出的尺寸
//getWidth()
//getHeight()
}
三、自身对尺寸有要求且需要考虑xml的情况.
class CircleView(context: Context?, attrs: AttributeSet?) : View(context, attrs) {
val paint = Paint(Paint.ANTI_ALIAS_FLAG)
val RADIUS = 100.dp
val PADDING = 50.dp
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
val size = (PADDING + RADIUS).toInt() * 2
setMeasuredDimension(
resolveSize(size, widthMeasureSpec),
resolveSize(size, heightMeasureSpec)
)
}
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
canvas.drawCircle(PADDING + RADIUS, PADDING + RADIUS, RADIUS, paint)
}
}
网友评论