★60.自定义控件 ★02.自定义View分类与流程

2017-06-29  本文已影响0人  iDragonfly

0. 流程图

1. 构造函数

//一般在直接New一个View的时候调用。
public void View(Context context) {}
//一般在layout文件中使用的时候会调用,关于它的所有属性(包括自定义属性)都会包含在attrs中传递进来。
public void View(Context context, AttributeSet attrs) {}
public void View(Context context, AttributeSet attrs, int defStyleAttr) {}                   // 通常不用
public void View(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {}  // 通常不用

2. 使用onMeasure()测量View大小()

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任何限制,子View可以设置为任意大小。
EXACTLY 01 表示父View已经确切的指定了子View的大小。
AT_MOST 10 表示子View具体大小没有尺寸限制,但是存在上限,上限一般为父View大小。

注意

3. 使用onSizeChanged()确定View大小

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
}

4. 使用onLayout()确定子View布局位置

child.layout(l,  t,  r,  b);
名称 说明 对应的函数
l View左侧距父View左侧的距离 getLeft()
t View顶部距父View顶部的距离 getTop()
r View右侧距父View左侧的距离 getRight()
b View底部距父View顶部的距离 getBottom()

5. 使用onDraw()绘制内容

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
}

6. 对外提供操作方法和监听回调

上一篇 下一篇

猜你喜欢

热点阅读