onMeasure方法在控件的父元素正要放置它的子控件时调用.它会问一个问题,“你想要用多大地方啊?”,然后传入两个参数——widthMeasureSpec和heightMeasureSpec.
它们指明控件可获得的空间以及关于这个空间描述的元数据.
比返回一个结果要好的方法是你传递View的高度和宽度到setMeasuredDimension方法里.
接下来的代码片段给出了如何重写onMeasure.注意,调用的本地空方法是来计算高度和宽度的.它们会译解widthHeightSpec和heightMeasureSpec值,并计算出合适的高度和宽度值.
java代码:
- @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来译解,如下面的片段所示:
java代码:
- int specMode = MeasureSpec.getMode(measureSpec);
- int specSize = MeasureSpec.getSize(measureSpec);
-
复制代码
依据specMode的值,如果是AT_MOST,specSize 代表的是最大可获得的空间;如果是EXACTLY,specSize 代表的是精确的尺寸;如果是UNSPECIFIED,对于控件尺寸来说,没有任何参考意义。
当以EXACT方式标记测量尺寸,父元素会坚持在一个指定的精确尺寸区域放置View。在父元素问子元素要多大空间时,AT_MOST指示者会说给我最大的范围。在很多情况下,你得到的值都是相同的。
在两种情况下,你必须绝对的处理这些限制。在一些情况下,它可能会返回超出这些限制的尺寸,在这种情况下,你可以让父元素选择如何对待超出的View,使用裁剪还是滚动等技术。
接下来的框架代码给出了处理View测量的典型实现:
java代码:
- @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;
- }
复制代码
分享到:
相关推荐
在Android开发中,`onMeasure()`方法是布局和视图尺寸计算的核心,它负责确定一个View的精确宽度和高度。本文将深入解析`onMeasure()`的工作原理,通过一个实例来帮助理解这一关键过程。 首先,`onMeasure()`方法在...
`onMeasure`方法在Android的View类中被定义,它是测量组件大小的核心方法。当一个View或ViewGroup需要确定其子视图的尺寸时,会调用这个方法。通常,自定义组件需要重写`onMeasure`以确保它们能正确地根据内容或特定...
Android View.onMeasure方法详解及实例 View在屏幕上显示出来要先经过measure(计算)和layout(布局). 1、什么时候调用onMeasure方法? 当控件的父元素正要放置该控件时调用.父元素会问子控件一个问题,“你想...
在Android中,`onMeasure()`方法用于测量View的尺寸,它决定了View的宽度和高度。通常,我们会在自定义View中覆写这个方法,以便根据内容或者特定需求计算出合适的大小。下面将详细介绍`onMeasure()`的工作原理以及...
近期做项目碰到ScrollView与Listview冲突的情况,查看了网上一些解决listview和scollView的冲突的方法,最终选择了重写onMeasure的方法来解决这个问题。 在此对各种方法做一个个人的总结评价。 主要的方法有四种: ...
Android 重写ViewGroup 中onMeasure()和onLayout()方法详解 Android 中的 ViewGroup 是一个抽象类,继承自 View,提供了基本的布局管理功能。为了提供更好的自定义布局,需要重写 ViewGroup 中的两个重要方法:...
同时,可以结合`onMeasure()`和`onLayout()`方法,控制自定义View的尺寸和位置。 六、硬件加速 Android系统支持硬件加速,可以提高图形绘制的性能。通过在Manifest.xml中为应用或单个Activity启用硬件加速,可以...
onLayout在Android中view如何完成绘制这个过程介绍了很多,但是很多理论化的东西,最近重新整理一下,通俗的讲解一下。View绘制过程就好比你向银行贷款, 在Android中view如何完成绘制这个过程介绍了很多,但是很多...
1. 自定义TreeView需要继承自ViewGroup,例如LinearLayout或RecyclerView,通过重写onMeasure()和onLayout()方法来实现布局的绘制。 2. 每个节点通常是一个自定义的View,包含文本、图标和其他元素,可以通过设置...
本文详细介绍了Android屏幕元素的相关概念和技术要点,包括基本的屏幕元素(如`Activity`、`ViewGroup`和`View`)、常见的布局方式以及事件响应方法。理解这些基础知识对于开发高质量的Android应用至关重要。通过...
我们可以通过继承已有的Android控件,然后覆盖(override)其关键方法,如onDraw()用于绘制控件外观,onTouchEvent()处理触摸事件,onMeasure()和onLayout()则用于布局和尺寸计算。通过这种方法,我们可以改变控件的...
Android 圆弧刷新动画 ...Android 圆弧刷新动画的实现需要结合 canvas 的 drawArc 方法、圆弧的位置确定和自定义 View 的 onMeasure 方法。通过掌握这些知识点,可以轻松实现一个简单的 Android 圆弧刷新动画。
在Android开发中,`onMeasure()`方法是自定义View时非常关键的一个环节,它负责确定View的尺寸。本文将深入探讨`onMeasure()`的工作原理、调用时机以及如何在实际项目中进行有效的尺寸测量。 首先,`onMeasure()`是...
Android自定义View绘制的方法及过程是Android开发中非常重要的一部分,本文将详细介绍Android自定义View绘制的方法及过程,包括onSizeChanged、onDraw、onMeasure顺序的解释。 在Android中,自定义View的绘制过程...
解决这个问题的方法是重写 GridView 的 onMeasure 方法,使其不能滚动。我们可以通过继承 GridView 并重写其 onMeasure 方法来实现这个功能。 在下面是一个示例代码: ```java public class MyGridView extends ...
这篇博客"Android 常用画图方法练习"可能涵盖了如何在Android平台上利用Canvas、Paint等工具进行图形绘制的技术要点。以下是对这些知识点的详细说明: 1. **Canvas与Paint** - **Canvas** 是Android中用于在Bitmap...
博客《FlowLayout详解(一)——onMeasure()与onLayout()》对应源码,博客地址:http://blog.csdn.net/harvic880925/article/details/47029169
使用`onDraw()`方法进行绘图,而`onMeasure()`方法用于确定视图的大小。 2. **数据模型**:定义一个数据结构来存储当前选中的日期,以及可选的日期范围。这可能是`Calendar`对象或者自定义的日期类。 3. **事件...