onMeasure
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
- {
- int width = measureWidth(widthMeasureSpec);
- int height = measureHeight(heightMeasureSpec);
- setMeasuredDimension(width, height);
- mRealWidth = getMeasuredWidth() - getPaddingLeft() - getPaddingRight();
- mTextStartX = mRealWidth / 2 - mTextWidth / 2;
- }
- private int measureHeight(int measureSpec)
- {
- int mode = MeasureSpec.getMode(measureSpec);
- int val = MeasureSpec.getSize(measureSpec);
- int result = 0;
- switch (mode)
- {
- case MeasureSpec.EXACTLY:
- result = val;
- break;
- case MeasureSpec.AT_MOST:
- case MeasureSpec.UNSPECIFIED:
- result = mTextBound.height();
- break;
- }
- result = mode == MeasureSpec.AT_MOST ? Math.min(result, val) : result;
- return result + getPaddingTop() + getPaddingBottom();
- }
- private int measureWidth(int measureSpec)
- {
- int mode = MeasureSpec.getMode(measureSpec);
- int val = MeasureSpec.getSize(measureSpec);
- int result = 0;
- switch (mode)
- {
- case MeasureSpec.EXACTLY:
- result = val;
- break;
- case MeasureSpec.AT_MOST:
- case MeasureSpec.UNSPECIFIED:
- // result = mTextBound.width();
- result = mTextWidth;
- break;
- }
- result = mode == MeasureSpec.AT_MOST ? Math.min(result, val) : result;
- return result + getPaddingLeft() + getPaddingRight();
- }
关于测量,也是比较传统的写法,根据传入的widthMeasureSpec、heightMeasureSpec,利用MeasureSpec分别获取模式和值,如何是EXACTLY万事大吉,如果是AT_MOST、UNSPECIFIED那么就进行自己测量需要的空间,当然了,最好注意如果是AT_MOST不应该大于父类传入的值。
这里提一下,如果偷懒的话,可以选择继承TextView,然后测量就不需要写了,TextView默认帮你实现了,还能利用TextView的一些属性,不过咱们这个例子比较简单,我最终还是选择了继承View,继承View有种everything under control 的感觉。
测量完成以后,不用说都是绘制了。