美文网首页
自定义布局之尺寸的自定义

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

作者: 王灵 | 来源:发表于2021-04-13 13:37 被阅读0次

    本文所要叙述的是自定义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)
        }
    }
    

    相关文章

      网友评论

          本文标题:自定义布局之尺寸的自定义

          本文链接:https://www.haomeiwen.com/subject/iruqlltx.html