`
talin2010
  • 浏览: 520982 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

计算控件尺寸

阅读更多


除非你总是需要一个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;

}

分享到:
评论

相关推荐

    基于vc6.0窗口最大化后控件不能一起变大的问题

    2. **监听窗口尺寸变化**:在窗口类中重写`OnSize`消息处理函数,当窗口尺寸发生变化时触发重新计算控件尺寸的过程。 3. **重新设置控件尺寸**:定义一个辅助函数`resize`,用于计算新的窗口尺寸与原始尺寸的比例,...

    (实例037)动态改变控件尺寸.rar

    在编程领域,尤其是在GUI(图形用户界面)设计中,动态改变控件尺寸是一项重要的技能,特别是在创建响应式或自适应用户界面时。本实例037着重探讨如何在不同的编程环境中,如Windows Forms、WPF、Qt、Android、iOS等...

    加法计算控件

    3. **适应性**:计算控件应能在不同设备和屏幕尺寸上正常工作,具备良好的响应式设计。 4. **可访问性**:考虑到有特殊需求的用户,如视力障碍者,控件需兼容屏幕阅读器和其他辅助技术。 总的来说,加法计算控件是...

    安卓自定义控件相关-该控件支持数据自动换行数据动态添加并准确计算该控件行高.rar

    为了准确计算控件的高度,需要遍历所有行,累加每一行的高度。 5. **注意事项**: 提示中提到“程序如果跑不起来需要自调”,这意味着提供的代码可能只是一个基本框架,可能需要根据实际项目需求进行适配和调试。...

    Android代码-SwitchView

    3. 在自定义控件类中重写必要的方法,如onDraw()用于绘制自定义视图,onMeasure()用于计算控件尺寸,以及onClick()或onCheckedChangeListener()来响应用户的点击事件。 4. 实现动画逻辑,这可能需要用到...

    多浏览器兼容性测试平台xbrowser剖析.ppt

    2. **控件尺寸获取**:系统通过精确计算控件尺寸,解决了系统方法获取尺寸与实际显示不一致的问题。 3. **自定义控件处理**:支持XPath解析程序,适用于所有浏览器,可处理任何通用属性,执行速度优于Chrome下的...

    控件操作集合_labview控件操作集合_

    例如,数值显示控件用于显示实时或计算出的数值,按钮则可以触发特定的程序流程。 2. **复杂控件**:除了基本控件,LabVIEW还有许多高级控件,如图表、波形图、簇、数组等。这些控件用于处理更复杂的数据显示和数据...

    vc,更改控件大小

    控件尺寸的调整可以通过多种方式实现,这里我们将讨论几种常见的方法: 1. **手动调整**:这是最基本的方式,通过资源编辑器直接修改控件的Width和Height属性。但这对于大量控件或需要动态调整的情况非常不实用。 ...

    WinForm窗体及其控件的自适应,winform控件随窗口自适应,C#

    在这个事件中,我们会根据新旧窗体尺寸计算出缩放比例,并应用到每个控件上。这里可以使用递归方法遍历窗体的所有子控件,包括嵌套的容器控件,如Panel或GroupBox。以下是一个简单的例子: ```csharp private void ...

    Winform控件随窗体缩放

    - **比例缩放**:一种常见的方法是根据窗体的新尺寸计算出每个控件的新尺寸,然后设置控件的Size属性。这种方式适用于需要保持控件相对比例的情况。 - **固定边距缩放**:另一种方式是让控件与窗体的边缘保持一定...

    VC窗口控件布局管理代码

    布局管理就是指控制这些控件在窗口中的位置和大小,以适应不同分辨率和屏幕尺寸的设备。 在VC++中,MFC(Microsoft Foundation Classes)库提供了多种方法来实现布局管理。一种常见的方法是使用CWnd类的成员函数...

    动态改变MFC控件位置和大小

    可以创建一个函数,如`AdjustLayoutForResolution()`,在OnSize()函数中调用,根据当前屏幕分辨率重新计算控件的位置和大小。 5. **注意事项**: - 控件的位置调整需要考虑到控件之间的相互关系,例如网格布局、...

    javascript控件开发之布局控件

    - **布局计算**:根据当前屏幕尺寸、其他控件的位置和大小,计算出控件的布局信息。 - **更新视图**:根据布局计算的结果,更新控件在页面上的位置和大小。 - **响应式**:根据屏幕尺寸变化,自动调整控件布局。 - *...

    MFC 标签控件 数据 计算

    在实际编程中,还需要考虑错误处理,比如检查输入是否合法,矩阵尺寸是否符合乘法规则,以及数值计算的精度问题。此外,为了提高用户体验,可以添加进度条控件(CProgressCtrl)来显示计算进度,或者使用状态栏...

    控件自适应窗体大小

    2. **调整子控件的位置和尺寸**:遍历所有子控件,使用原始位置和尺寸以及缩放比例来计算新的位置和尺寸,并更新控件的实际位置和尺寸。 代码示例: ```csharp public void controlAutoSize(Form mForm) { float ...

    等比例缩放控件 控件随窗口变化而变化

    在一些高级场景下,可能需要编写自定义的布局管理器或控件,这通常涉及到重写OnResize事件处理程序,以及计算每个子控件的新大小和位置。这种情况下,开发者需要考虑控件的宽高比,确保它们在缩放过程中保持原有的...

    对话框中控件大小的自适应改变

    要实现控件大小的自适应改变,我们需要关注两个关键步骤:计算变化比例和调整控件大小。 1. 计算变化比例: 当用户拖动对话框边角改变大小时,我们可以捕获WM_SIZE消息,这个消息在窗口大小改变时被发送。在OnSize...

    c# 控件大小(及字体)随窗口大小改变自动缩放

    以上代码中,我们假设了一个基准窗口宽度800像素,并根据当前窗口的宽度计算出缩放比例,然后应用到所有控件的字体大小上。 在实际开发中,还可以结合使用LayoutTransform、RenderTransform等技术,以及自定义布局...

    仪表盘控件_仪表盘控件_仪表盘控件显示_

    5. **性能优化**:由于可能需要处理大量数据和复杂的计算,控件需要优化以保证流畅的用户体验,即使在数据量大或网络条件不佳的情况下也能快速响应。 6. **多平台兼容**:随着跨平台开发的需求增加,仪表盘控件应能...

    android自定义控件介绍,重写控件

    我们可以通过继承已有的Android控件,然后覆盖(override)其关键方法,如onDraw()用于绘制控件外观,onTouchEvent()处理触摸事件,onMeasure()和onLayout()则用于布局和尺寸计算。通过这种方法,我们可以改变控件的...

Global site tag (gtag.js) - Google Analytics