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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shb2058/article/details/87189294

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。

展开阅读全文

没有更多推荐了,返回首页