自定义Viewgroup实现流式布局(1):回顾自定义view

1.常用的3个方法:onMeasure,onLayout,onDraw
onLayout:确定子控件的位置,自定义ViewGroup才会用
onDraw:绘制(ViewGroup不设置背景的话是不会触发这个方法的,因为只是个容器,容器里面的所有内容怎么出现都是子view的onDraw实现的,只有操作这个ViewGroup本身,才会走自己的onDraw)
onMeasure:计算控件的大小

三个方法的触发顺序
onMeasure> onLayout> onDraw
2.onMeasure的三种计算模式
EXACTLY对应match或者指定大小
AT_MOST对应wrap
UNSPECIFIED对应未知
3.当继承view,实现onDraw方法绘制几个文字并设置view大小会wrap时,为什么view的实际区域却是match的样子?
这跟view自带的onMeasure方法有关系,点到view源码可以看到在这个方法中返回的计算宽高,在当warp时返回的是macth。

源码如下:

public static int getDefaultSize(int size, int measureSpec) {
        int result = size;
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);

        switch (specMode) {
        case MeasureSpec.UNSPECIFIED:
            result = size;
            break;
        case MeasureSpec.AT_MOST:
        case MeasureSpec.EXACTLY:
            result = specSize;
            break;
        }
        return result;
    }


4.自定义view时如何设置他的宽高?
调用setMeasuredDimension(width, height);方法来设置宽高
5.如何得到默认设置的宽高?
int widthMode = MeasureSpec.getMode(widthMeasureSpec);   //获取宽的模式
int heightMode = MeasureSpec.getMode(heightMeasureSpec); //获取高的模式
int widthSize = MeasureSpec.getSize(widthMeasureSpec);   //获取宽的尺寸
int heightSize = MeasureSpec.getSize(heightMeasureSpec); //获取高的尺寸
如3所述当view写的wrap时,这个计算值就是当前可用的剩余区域。
6.如何正确的设置宽高?
比如:实现一个如果内容小于一行则全部显示如果内容大于一行则每行只能显示7个字符的Textview。
不换行的方法:继承view,重写ondraw()方法,canvas.drawText,给定基线的起始XY即可。
如果需要文字的纵向中心是你设定的某个Y值,则需要计算基线的位置,因为基线!=中线,可参考下:
文字在矩形居中
7.view和viewgroup如何刷新

view的所有显示是在onDraw里面处理的,调用invalidate()即可;

viewgroup总子控件的显示是在onMeasure和onlayout里面,需要调用requestLayout方法,如果是更改viewgroup的背景颜色,还是需要调用invalidate。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值