一、一个简单的例子:
重写自定义View的onDraw()代码:
oval.left=getMeasuredWidth()/2-radius;
oval.top=getMeasuredHeight()/2 -radius;
oval.right=getMeasuredWidth()/2 +radius;
oval.bottom=getMeasuredHeight()/2 +radius;
canvas.drawArc(oval,0,360,true,mPaint);
得到效果图如下:
这么做肯定没问题。
有这么个疑问:
二、getwidth,getheight和getMeasuredWidth和getMeasuredHeight的分别是什么?区别是什么?
定义总结:
getwidth():viewGroup的遍历每个子view,子view的layout()方法测量的结果。测量方式:getwidth=子布局右侧-子布局左侧;
getMeasuredWidth():viewGroup的遍历每个子view,子view的最近一次调用measure()方法测量后得到的,就是View的宽度。
源码分析区别:
回到这个getWidth()方法和getMeasureWidth()的区别这个问题上。
网上说法很多,我决定自己一点点从源码里面扣。然后举例说明。
三、View#getMeasuredWidth():
public final int getMeasuredWidth() {
return mMeasuredWidth & MEASURED_SIZE_MASK;
}
得到的是最近一次调用measure()方法测量后得到的是View的宽度。
跟一下源码知道:
平时我们自定义View(继承view)会重写onMeasure方法:(什么情况下写onMeasure?后续会有解答)
View#onMeasure源码如下:
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),
getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));
}
上面View#onMeasure方法会调用
View#setMeasuredDimension源码如下:
protected final void setMeasuredDimension(int measuredWidth, int measuredHeight) {
boolean optical = isLayoutModeOptical(this);
if (optical != isLayoutModeOptical(mParent)) {
Insets insets = getOpticalInsets();
i