自定义布局之尺寸的自定义

2021-04-13  本文已影响0人  王灵

本文所要叙述的是自定义View(不带子view)的尺寸的控制。

最基本的要求

案例就实现一个正方形的头像显示框!

一、显示头像图片

直接创建一个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)
    }
}
上一篇 下一篇

猜你喜欢

热点阅读