除非你总是需要一个100
×100
像素的控件,否则,你必须要重写
onMeasure
。
onMeasure
方法在控件的父元素正要放置它的子控件时调用。它会问一个问题,“你想要用多大地方啊?”,然后传入两个参数——
widthMeasureSpec和heightMeasureSpec。它们指明控件可获得的空间以及关于这个空间描述的元数据。
比返回一个结果要好的方法是你传递
View
的高度和宽度到setMeasuredDimension方法里。
接下来的代码片段给出了如何重写
onMeasure
。注意,调用的本地空方法是来计算高度和宽度的。它们会译解widthHeightSpec和heightMeasureSpec值,并计算出合适的高度和宽度值。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int measuredHeight = measureHeight(heightMeasureSpec);
int measuredWidth = measureWidth(widthMeasureSpec);
setMeasuredDimension(measuredHeight, measuredWidth);
}
private int measureHeight(int measureSpec) {
// Return measured widget height.
}
private int measureWidth(int measureSpec) {
// Return measured widget width.
}
边界参数——widthMeasureSpec和heightMeasureSpec
,效率的原因以整数的方式传入。在它们使用之前,首先要做的是使用
MeasureSpec
类的静态方法
getMode
和
getSize
来译解,如下面的片段所示:
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
依据specMode的值,如果是AT_MOST,specSize 代表的是最大可获得的空间;如果是EXACTLY,specSize 代表的是精确的尺寸;如果是UNSPECIFIED,对于控件尺寸来说,没有任何参考意义。
当以
EXACT
方式标记测量尺寸,父元素会坚持在一个指定的精确尺寸区域放置
View
。在父元素问子元素要多大空间时,AT_MOST指示者会说给我最大的范围。在很多情况下,你得到的值都是相同的。
在两种情况下,你必须绝对的处理这些限制。在一些情况下,它可能会返回超出这些限制的尺寸,在这种情况下,你可以让父元素选择如何对待超出的
View
,使用裁剪还是滚动等技术。
接下来的框架代码给出了处理
View
测量的典型实现:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int measuredHeight = measureHeight(heightMeasureSpec);
int measuredWidth = measureWidth(widthMeasureSpec);
setMeasuredDimension(measuredHeight, measuredWidth);
}
private int measureHeight(int measureSpec) {
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
// Default size if no limits are specified.
int result = 500;
if (specMode == MeasureSpec.AT_MOST)
{
// Calculate the ideal size of your
// control within this maximum size.
// If your control fills the available
// space return the outer bound.
result = specSize;
}
else if (specMode == MeasureSpec.EXACTLY)
{
// If your control can fit within these bounds return that value.
result = specSize;
}
return result;
}
private int measureWidth(int measureSpec) {
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
// Default size if no limits are specified.
int result = 500;
if (specMode == MeasureSpec.AT_MOST)
{
// Calculate the ideal size of your control
// within this maximum size.
// If your control fills the available space
// return the outer bound.
result = specSize;
}
else if (specMode == MeasureSpec.EXACTLY)
{
// If your control can fit within these bounds return that value.
result = specSize;
}
return result;
}
相关推荐
2. **监听窗口尺寸变化**:在窗口类中重写`OnSize`消息处理函数,当窗口尺寸发生变化时触发重新计算控件尺寸的过程。 3. **重新设置控件尺寸**:定义一个辅助函数`resize`,用于计算新的窗口尺寸与原始尺寸的比例,...
在编程领域,尤其是在GUI(图形用户界面)设计中,动态改变控件尺寸是一项重要的技能,特别是在创建响应式或自适应用户界面时。本实例037着重探讨如何在不同的编程环境中,如Windows Forms、WPF、Qt、Android、iOS等...
3. **适应性**:计算控件应能在不同设备和屏幕尺寸上正常工作,具备良好的响应式设计。 4. **可访问性**:考虑到有特殊需求的用户,如视力障碍者,控件需兼容屏幕阅读器和其他辅助技术。 总的来说,加法计算控件是...
为了准确计算控件的高度,需要遍历所有行,累加每一行的高度。 5. **注意事项**: 提示中提到“程序如果跑不起来需要自调”,这意味着提供的代码可能只是一个基本框架,可能需要根据实际项目需求进行适配和调试。...
3. 在自定义控件类中重写必要的方法,如onDraw()用于绘制自定义视图,onMeasure()用于计算控件尺寸,以及onClick()或onCheckedChangeListener()来响应用户的点击事件。 4. 实现动画逻辑,这可能需要用到...
2. **控件尺寸获取**:系统通过精确计算控件尺寸,解决了系统方法获取尺寸与实际显示不一致的问题。 3. **自定义控件处理**:支持XPath解析程序,适用于所有浏览器,可处理任何通用属性,执行速度优于Chrome下的...
例如,数值显示控件用于显示实时或计算出的数值,按钮则可以触发特定的程序流程。 2. **复杂控件**:除了基本控件,LabVIEW还有许多高级控件,如图表、波形图、簇、数组等。这些控件用于处理更复杂的数据显示和数据...
控件尺寸的调整可以通过多种方式实现,这里我们将讨论几种常见的方法: 1. **手动调整**:这是最基本的方式,通过资源编辑器直接修改控件的Width和Height属性。但这对于大量控件或需要动态调整的情况非常不实用。 ...
在这个事件中,我们会根据新旧窗体尺寸计算出缩放比例,并应用到每个控件上。这里可以使用递归方法遍历窗体的所有子控件,包括嵌套的容器控件,如Panel或GroupBox。以下是一个简单的例子: ```csharp private void ...
- **比例缩放**:一种常见的方法是根据窗体的新尺寸计算出每个控件的新尺寸,然后设置控件的Size属性。这种方式适用于需要保持控件相对比例的情况。 - **固定边距缩放**:另一种方式是让控件与窗体的边缘保持一定...
布局管理就是指控制这些控件在窗口中的位置和大小,以适应不同分辨率和屏幕尺寸的设备。 在VC++中,MFC(Microsoft Foundation Classes)库提供了多种方法来实现布局管理。一种常见的方法是使用CWnd类的成员函数...
可以创建一个函数,如`AdjustLayoutForResolution()`,在OnSize()函数中调用,根据当前屏幕分辨率重新计算控件的位置和大小。 5. **注意事项**: - 控件的位置调整需要考虑到控件之间的相互关系,例如网格布局、...
- **布局计算**:根据当前屏幕尺寸、其他控件的位置和大小,计算出控件的布局信息。 - **更新视图**:根据布局计算的结果,更新控件在页面上的位置和大小。 - **响应式**:根据屏幕尺寸变化,自动调整控件布局。 - *...
在实际编程中,还需要考虑错误处理,比如检查输入是否合法,矩阵尺寸是否符合乘法规则,以及数值计算的精度问题。此外,为了提高用户体验,可以添加进度条控件(CProgressCtrl)来显示计算进度,或者使用状态栏...
2. **调整子控件的位置和尺寸**:遍历所有子控件,使用原始位置和尺寸以及缩放比例来计算新的位置和尺寸,并更新控件的实际位置和尺寸。 代码示例: ```csharp public void controlAutoSize(Form mForm) { float ...
在一些高级场景下,可能需要编写自定义的布局管理器或控件,这通常涉及到重写OnResize事件处理程序,以及计算每个子控件的新大小和位置。这种情况下,开发者需要考虑控件的宽高比,确保它们在缩放过程中保持原有的...
要实现控件大小的自适应改变,我们需要关注两个关键步骤:计算变化比例和调整控件大小。 1. 计算变化比例: 当用户拖动对话框边角改变大小时,我们可以捕获WM_SIZE消息,这个消息在窗口大小改变时被发送。在OnSize...
以上代码中,我们假设了一个基准窗口宽度800像素,并根据当前窗口的宽度计算出缩放比例,然后应用到所有控件的字体大小上。 在实际开发中,还可以结合使用LayoutTransform、RenderTransform等技术,以及自定义布局...
5. **性能优化**:由于可能需要处理大量数据和复杂的计算,控件需要优化以保证流畅的用户体验,即使在数据量大或网络条件不佳的情况下也能快速响应。 6. **多平台兼容**:随着跨平台开发的需求增加,仪表盘控件应能...
我们可以通过继承已有的Android控件,然后覆盖(override)其关键方法,如onDraw()用于绘制控件外观,onTouchEvent()处理触摸事件,onMeasure()和onLayout()则用于布局和尺寸计算。通过这种方法,我们可以改变控件的...