自定义View分类
自定义ViewGroup
自定义ViewGroup一般是利用现有的组件根据特定的布局方式来组成新的组件,大多继承自ViewGroup或各种layout,包含有子View
自定义View
在没有现成的View,需要自己实现的时候,就使用自定义View,一般继承自View,SurfaceView或其他View
几个重要的函数
构造函数
public void MyView(Context context) {}
public void MyView(Context context, AttributeSet attrs) {}
public void MyView(Context context, AttributeSet attrs, int defStyleAttr) {}
public void MyView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {}
注意:布局文件中引用的控件调用的构造方法是两个参数的
onMeasure()
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthsize = MeasureSpec.getSize(widthMeasureSpec); //取出宽度的确切数值
int widthmode = MeasureSpec.getMode(widthMeasureSpec); //取出宽度的测量模式
int heightsize = MeasureSpec.getSize(heightMeasureSpec); //取出高度的确切数值
int heightmode = MeasureSpec.getMode(heightMeasureSpec); //取出高度的测量模式
}
测量模式一共有三种
模式 | 二进制数值 | 描述 |
---|---|---|
UNSPECIFIED | 00 | 默认值,父控件没有给子控件View任何约束,子View可以设置任意大小 |
EXACTLY | 01 | 表示父控件已经确切的指定了子View的大小 |
AT_MOST | 10 | 表示子View具体大小没有尺寸限制,但是存在上限,上限一般为父View大小 |
onLayout()
在自定义ViewGroup中会用到,用于确定子View的位置
child.layout(l, t, r, b);
四个参数分别为:
名称 | 说明 | 对应的函数 |
---|---|---|
l | View左侧距父View左侧的距离 | getLeft() |
t | View顶部距父View顶部的距离 | getTop() |
r | View右侧距父View左侧的距离 | getRight() |
b | View底部距父View顶部的距离 | getBottom() |
onDraw()
实际绘制的部分,使用的是canvas绘图