`
talin2010
  • 浏览: 503255 次
  • 性别: 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;

}

分享到:
评论

相关推荐

    VB编程资源大全(控件 其它3)

    DEMO版(269KB) 41,apipro.EXE 提供了35个与Windows API类似的功能,例如获得系统信息注册表操作等,对于VB新手是一个不错的工具,但对于熟悉API操作的老将没有多大实用价值,而且控件尺寸偏大(344KB) 42,...

    计算机收发短信的OCX控件

    该设备尺寸为100mm×58mm×24.5mm(长×宽×高,其中天线21mm),有一个标准的USB接口,通过标准的USB连接线,连接计算机。该设备不用电池,启动计算机后,就会自动开启。利用此设备,可以把计算机当成手机使用,在...

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

    该代码简单的介绍了基于MFC对话框工程中控件的自适应改变,其基于计算变化比例的方法,进而计算出变化后调整控件大小

    VB编程资源大全(控件 其它1)

    DEMO版(269KB) 41,apipro.EXE 提供了35个与Windows API类似的功能,例如获得系统信息注册表操作等,对于VB新手是一个不错的工具,但对于熟悉API操作的老将没有多大实用价值,而且控件尺寸偏大(344KB) 42,...

    可定义表格控件2.0.1.2

    『精确报表套打,智能脚本计算』 <br>可定义表格控件是一个固定表格输出控件,用于精确的预览和打印各种固定表格的报表、支票、收据等。您既可以在空白纸上打印完整的报表和票据,也可以在已有的表格纸上定点打印...

    Microdraw图形控件开发版本-试用版

    1. 算法模块,计算图形的长度、面积、体积、交点等; 寻找最大封闭区域、最小 封闭区域、偏移元素;有限元分析算法;图形比较算法;区域求交算法等; 2.数控加工模块,提取几何元素加工数据;优化加工路径; 3.图库...

    VB编程资源大全(控件 其它2)

    DEMO版(269KB) 41,apipro.EXE 提供了35个与Windows API类似的功能,例如获得系统信息注册表操作等,对于VB新手是一个不错的工具,但对于熟悉API操作的老将没有多大实用价值,而且控件尺寸偏大(344KB) 42,...

    DefinedTable可定义编程表格控件 2.0.1.2

    精确报表套打,智能脚本计算 可定义表格控件是一个固定表格输出控件,用于精确的预览和打印各种固定表格 的报表、支票、收据等。您既可以在空白纸上打印完整的报表和票据,也可以在已有 的表格纸上定点打印数据...

    El Inputte for .NET---最新标准的输入界面控件

    能够根据其它控件的大小自动优化调整尺寸以外,并能设置输入区域水平和垂直方向上上下左右配置的间隔。 ADO.NET连接 支持.NET Framework提供的ADO.NET连接;充分利用强大的ADO.NET功能,构建真正的数据库输入前端...

    WPF界面最大化不覆盖任务栏

    WPF界面最大化不覆盖任务栏 ,通过计算任务栏尺寸 IntPtr taskBarWnd = FindWindow("Shell_TrayWnd", null); IntPtr tray = FindWindowEx(taskBarWnd, IntPtr.Zero, "TrayNotifyWnd", null); IntPtr trayclock...

    UIScrollViewAutoLayout:在Storyboard或xib中给UIScrollView的子控件添加自动布局约束

    给UIScrollView的子控件添加AutoLayout约束和其他普通的控件不同,因为scrollView需要根据子控件的尺寸和距离周围的边距来计算contentSize.#####UIScrollView添加约束的正确方式如下:首先,scrollView自身的约束...

    MicroDraw图形控件

    3.尺寸属性:颜色,箭头,尺寸线属性,尺寸引线属性,尺寸文字属性,显示单位等;4.文字属性:字体和颜色;字体包括:字体名称,字体高度宽度,是否重显,倾斜,字符集,大小型文件字体(兼容AutoCAD shx字体文件)...

    jhc:SWTSwingAWT的Java热图窗口小部件控件

    此外,考虑到预定义的最大尺寸,按需为窗口小部件的当前尺寸计算热图。 当将热图缩放到小部件的当前大小时,数据本身将被缩小,而不是渲染的图像。 计算是在后台线程中执行的,从而允许在渲染过程中进行耗时的过程...

    Android自定义收音机搜台控件RadioRulerView

    下图为尺子尺寸的计算方法: 贴上关键代码: /** * 画固定的尺子 * @param canvas */ private void drawLine(Canvas canvas) { canvas.save(); int height = mHeight; int drawCount =

    GLSL之“大长腿”美颜效果.zip

    GLSL之“大长腿”美颜效果:详细地实现了图片的“大长腿”的效果,获取纹理的高度, 并根据纹理的高度以及宽度, 计算出图片合理的宽度;根据当前控件尺寸和纹理尺寸,计算初始纹理坐标等重点逻辑的详细实现和注释讲解

    GDI+显示器触屏测试测试版

    GDI+显示器触屏测试测试版 1、GDI+绘制控件 2、自动计算屏幕尺寸,自动缩放

    winform自绘波形,鼠标滚轮滚动缩放波形尺寸

    winform自绘波形,鼠标滚轮滚动以鼠标为中心缩放波形尺寸,鼠标按下图形左右拖拽图形,1~2键盘按键可以画出俩个时间标尺计算俩个标尺之间的时间,双缓冲panel自定义控件绘图不闪烁

    Delphi网络通信协议分析与应用实现pdf清晰

    10.5.2 文件尺寸 10.6 传真编码 10.6.1 一维编码(改进型哈夫曼编码) 10.6.2 二维编码(READ编码) 10.6.3 编码方式综述 10.6.4 行终码 10.6.5 页编码 10.7 传真高级编程 10.7.1 创建工程项目 10.7.2 关键代码...

    AlphaControlsV8.52注册版〖D5~XE5〗

    改进了滚动最小缩略尺寸的计算; 改进了标题栏提示的皮肤; 改进了TsFrameBar组件的动画; 改进了TsBitBtn动画闪烁的问题; 新增TsDBDecimalSpinEdit, TsDBComboBoxEx, TsDBListBoxEx 和 TsDBRadioGroupEx 四个组件 ...

    C#编程经验技巧宝典

    6 <br>0014 如何锁定窗体中的控件 6 <br>0015 统一窗体中控件的字体设置 7 <br>0016 通过“格式”菜单布局窗体 7 <br>0017 起始页中的“Visual Studio开发人员新闻” 7 <br>1.3 MSDN帮助的...

Global site tag (gtag.js) - Google Analytics