android的布局分两个阶段,先measure()后requestLayout(),
一个MeasureSpec封装了父布局传给子布局的布局要求。每个MeasureSpec代表了一个宽度或高度的要求。一个MeasureSpec包含一个尺寸和模式。
MeasureSpec的三种模式:
UNSPECIFIED:父布局没有给子布局任何限制,子布局可以任意大小。
EXACTLY:父布局决定子布局的确切大小。不论子布局多大,它都必须限制在这个界限里。
AT_MOST:子布局可以根据自己的大小选择任意大小。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int measuredHeight = measureHeight(heightMeasureSpec);
int measuredWidth = measureWidth(widthMeasureSpec);
setMeasuredDimension(measuredHeight, measuredWidth);
//final DisplayMetrics metrics = getResources().getDisplayMetrics();
//setMeasuredDimension(mBitmap.getScaledWidth(metrics),mBitmap.getScaledHeight(metrics));
}
private int measureHeight(int measureSpec) {
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
int result = 500;
if (specMode == MeasureSpec.AT_MOST)
{
result = specSize;
}
else if (specMode == MeasureSpec.EXACTLY)
{
result = specSize;
}
return result;
}
private int measureWidth(int measureSpec) {
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
int result = 500;
if (specMode == MeasureSpec.AT_MOST)
{
result = specSize;
}
else if (specMode == MeasureSpec.EXACTLY)
{
result = specSize;
}
return result;
}
Creation
Constructors
onFinishInflate() 当View和它的所有子对象从XML中导入之后,调用此方法
Layout
onMeasure(int, int) View会调用此方法,来确认自己及所有子对象的大小
onLayout(boolean, int, int, int, int, int, int) 当View要为所有子对象分配大小和位置时,调用此方法
onSizeChanged(int, int, int, int) 当View大小改变时,调用此方法
Drawing
onDraw(Canvas) 当View要绘制它的内容时,调用此方法
Event processing
onKeyDown(int, KeyEvent) 当一个新的按键事件发生时,调用此方法
onKeyUp(int, KeyEvent) 当一个按键释放事件发生时,调用此方法
onMotionEvent(MotionEvent) 当一个动作事件(如触摸)发生时,调用此方法
Focus
onFocusChanged(boolean, int) 当View获得或失去焦点时,调用此方法
Attaching
onAttachedToWindow() 当View附加到一个窗体上时,调用此方法
onDetachedFromWindow() 当View离开它的窗体时,调用此方法
当你为一个 activty 添加一个可见的 view, 并且运行这个activty时,android通常情况下会自动按照下列顺序来触发view的相关事件
onAttachedToWindow
onMeasure
onSizeChanged
onLayout
onDraw
相关推荐
2. 使用View.MeasureSpec.makeMeasureSpec(256, View.MeasureSpec.EXACTLY)来代替View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)。 View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec....
这可能涉及到测量(MeasureSpec)过程,确保自定义View能在不同屏幕尺寸和方向上正常工作。 6. XML布局支持:为了让开发者在XML布局文件中方便地使用RotateTextView,我们需要在自定义View中提供对应的XML属性,例如...
遵循`MeasureSpec`规则来计算合适的尺寸。 4. **绘制内容**:重写`onDraw()`方法,这是自定义View的核心部分。在这个方法里,使用`Canvas`对象进行绘制,例如,绘制转盘的背景、指针、分割线等元素。 5. **触摸...
int screenHeight = View.MeasureSpec.getSize(heightMeasureSpec); // 根据屏幕宽度和高度调整布局 super.onMeasure(widthMeasureSpec, heightMeasureSpec); } ``` 通过这种方式,可以实现在屏幕方向改变时...
`onMeasure()`方法有两个参数:`MeasureSpec`,它们分别代表父容器对View宽度和高度的要求。MeasureSpec包含两个部分:模式(Mode)和大小(Size)。模式可以是EXACTLY(表示必须精确到给定大小)、AT_MOST(表示不...
Android View 转 Bitmap 生成截图的方法 Android View 转 Bitmap 生成截图是一种常见的需求,特别是在分享图片和截屏功能中。下面将详细介绍三种不同的方法来实现 Android View 转 Bitmap 生成截图。 第一种方法:...
我们需要根据MeasureSpec提供的模式(EXACTLY, AT_MOST, UNSPECIFIED)和大小来计算自己的尺寸,并通过`setMeasuredDimension()`设置。例如: ```java @Override protected void onMeasure(int widthMeasureSpec, ...
textView.measure(MeasureSpec.makeMeasureSpec(measuredWidth, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(measuredHeight, MeasureSpec.EXACTLY)); imageView.measure(MeasureSpec.makeMeasureSpec...
view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); ...
webView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); webView.layout(0, 0, webView.getMeasuredWidth(), webView....
开发者可能需要利用Android的MeasureSpec和DisplayMetrics类来调整菜单大小和布局。 6. **源码结构**:良好的代码组织和注释也是源码学习的重要部分。通过阅读源码,我们可以了解如何构建可复用的自定义组件,以及...
自定义View转Bitmap的过程主要包括创建和布局自定义View、获取View的大小、绘制到Bitmap以及在Bitmap上添加额外内容。通过这个过程,我们可以满足产品的需求,将主应用中的页面作为带有文案的背景图分享到小程序。在...
setMeasuredDimension(MeasureSpec.makeMeasureSpec((int) totalWidth, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.EXACTLY)); } else { super.onMeasure...
view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());...
view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); view.layout(0, 0, view.getMeasuredWidth(), view....
2. **MeasureSpec**:在Android中,`MeasureSpec`是用来描述一个`View`应该多大。它包含了父视图提供的大小规格模式(EXACTLY, AT_MOST, UNSPECIFIED)和大小值,帮助确定`View`的尺寸。 3. **onMeasure()**:每个`...
MeasureSpec包含两个部分:模式(MeasureSpec.MODE)和大小(MeasureSpec.size),模式指定了尺寸的约束,大小则给出了建议的尺寸。通常需要根据约束来决定View的尺寸,同时考虑内容的填充。 四、事件处理 自定义...