通过重写ViewGroup学习onMeasure()和onLayout()方法

CANoe实战:LIN Slave一致性测试全流程解析 本文详细解析了使用CANoe进行LIN Slave一致性测试的全流程,包括测试概述、环境搭建、模块集成、测试用例详解及报告分析。通过实际案例分享,帮助工程师掌握LIN 2.0/2.1/2.2、SAE J2602和ISO 17987等标准的自动化测试方法,提升汽车电子从节点的可靠性和兼容性验证效率。 阅读详情
在继承ViewGroup类时,需要重写两个方法,分别是onMeasure和onLayout。
1,在方法onMeasure中调用setMeasuredDimension方法
void android.view.View.setMeasuredDimension(int measuredWidth, int measuredHeight)
在onMeasure(int, int)中,必须调用setMeasuredDimension(int width, int height)来存储测量得到的宽度和高度值,如果没有这么去做会触发异常IllegalStateException。
2,在方法onMeasure中调用孩子的measure方法
void android.view.View.measure(int widthMeasureSpec, int heightMeasureSpec)
这个方法用来测量出view的大小。父view使用width参数和height参数来提供constraint信息。实际上,view的测量工作在onMeasure(int, int)方法中完成。因此,只有onMeasure(int, int)方法可以且必须被重写。参数widthMeasureSpec提供view的水平空间的规格说明,参数heightMeasureSpec提供view的垂直空间的规格说明。
3,解析onMeasure(int, int)方法
void android.view.View.onMeasure(int widthMeasureSpec, int heightMeasureSpec)
测量view及其内容来确定view的宽度和高度。这个方法在measure(int, int)中被调用,必须被重写来精确和有效的测量view的内容。
在重写这个方法时,必须调用setMeasuredDimension(int, int)来存储测量得到的宽度和高度值。执行失败会触发一个IllegalStateException异常。调用父view的onMeasure(int, int)是合法有效的用法。
view的基本测量数据默认取其背景尺寸,除非允许更大的尺寸。子view必须重写onMeasure(int, int)来提供其内容更加准确的测量数值。如果被重写,子类确保测量的height和width至少是view的最小高度和宽度(通过getSuggestedMinimumHeight()和getSuggestedMinimumWidth()获取)。
4,解析onLayout(boolean, int, int, int, int)方法
void android.view.ViewGroup.onLayout(boolean changed, int l, int t, int r, int b)
调用场景:在view给其孩子设置尺寸和位置时被调用。子view,包括孩子在内,必须重写onLayout(boolean, int, int, int, int)方法,并且调用各自的layout(int, int, int, int)方法。
参数说明:参数changed表示view有新的尺寸或位置;参数l表示相对于父view的Left位置;参数t表示相对于父view的Top位置;参数r表示相对于父view的Right位置;参数b表示相对于父view的Bottom位置。.
5,解析View.MeasureSpec类
android.view.View.MeasureSpec
MeasureSpec对象,封装了layout规格说明,并且从父view传递给子view。每个MeasureSpec对象代表了width或height的规格。
MeasureSpec对象包含一个size和一个mode,其中mode可以取以下三个数值之一:
    UNSPECIFIED,1073741824 [0x40000000],未加规定的,表示没有给子view添加任何规定。
    EXACTLY,0 [0x0],精确的,表示父view为子view确定精确的尺寸。

    AT_MOST,-2147483648 [0x80000000],子view可以在指定的尺寸内尽量大。

在这里给大家举一个例子demo:

第一步:自定义一个View实现ViewGroup接口,即自定义ViewGroup:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package net.loonggg.viewgroup;  
  2.   
  3. import android.content.Context;  
  4. import android.util.AttributeSet;  
  5. import android.view.View;  
  6. import android.view.ViewGroup;  
  7.   
  8. public class MyViewGroup extends ViewGroup {
  9.     public MyViewGroup(Context context) {
  10.         super(context);  
  11.     }  
  12.   
  13.     public MyViewGroup(Context context, AttributeSet attrs) {
  14.         super(context, attrs);  
  15.     }  
  16.   
  17.     public MyViewGroup(Context context, AttributeSet attrs, int defStyle) {
  18.         super(context, attrs, defStyle);  
  19.     }  
  20.   
  21.     /** 
  22.      * 计算控件的大小 
  23.      */  
  24.     @Override  
  25.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  26.         super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
  27.         int measureWidth = measureWidth(widthMeasureSpec);  
  28.         int measureHeight = measureHeight(heightMeasureSpec);  
  29.         // 计算自定义的ViewGroup中所有子控件的大小  
  30.         measureChildren(widthMeasureSpec, heightMeasureSpec);  
  31.         // 设置自定义的控件MyViewGroup的大小  
  32.         setMeasuredDimension(measureWidth, measureHeight);  
  33.     }  
  34.   
  35.     private int measureWidth(int pWidthMeasureSpec) {  
  36.         int result = 0;  
  37.         int widthMode = MeasureSpec.getMode(pWidthMeasureSpec);// 得到模式  
  38.         int widthSize = MeasureSpec.getSize(pWidthMeasureSpec);// 得到尺寸  
  39.   
  40.         switch (widthMode) {  
  41.         /** 
  42.          * mode共有三种情况,取值分别为MeasureSpec.UNSPECIFIED, MeasureSpec.EXACTLY, 
  43.          * MeasureSpec.AT_MOST。 
  44.          *  
  45.          *  
  46.          * MeasureSpec.EXACTLY是精确尺寸, 
  47.          * 当我们将控件的layout_width或layout_height指定为具体数值时如andorid 
  48.          * :layout_width="50dip",或者为FILL_PARENT是,都是控件大小已经确定的情况,都是精确尺寸。 
  49.          *  
  50.          *  
  51.          * MeasureSpec.AT_MOST是最大尺寸, 
  52.          * 当控件的layout_width或layout_height指定为WRAP_CONTENT时 
  53.          * ,控件大小一般随着控件的子空间或内容进行变化,此时控件尺寸只要不超过父控件允许的最大尺寸即可 
  54.          * 。因此,此时的mode是AT_MOST,size给出了父控件允许的最大尺寸。 
  55.          *  
  56.          *  
  57.          * MeasureSpec.UNSPECIFIED是未指定尺寸,这种情况不多,一般都是父控件是AdapterView, 
  58.          * 通过measure方法传入的模式。 
  59.          */  
  60.         case MeasureSpec.AT_MOST:  
  61.         case MeasureSpec.EXACTLY:  
  62.             result = widthSize;  
  63.             break;  
  64.         }  
  65.         return result;  
  66.     }  
  67.   
  68.     private int measureHeight(int pHeightMeasureSpec) {
  69.         int result = 0;  
  70.   
  71.         int heightMode = MeasureSpec.getMode(pHeightMeasureSpec);
  72.         int heightSize = MeasureSpec.getSize(pHeightMeasureSpec);
  73.   
  74.         switch (heightMode) {  
  75.         case MeasureSpec.AT_MOST:  
  76.         case MeasureSpec.EXACTLY:  
  77.             result = heightSize;  
  78.             break;  
  79.         }  
  80.         return result;  
  81.     }  
  82.   
  83.     /** 
  84.      * 覆写onLayout,其目的是为了指定视图的显示位置,方法执行的前后顺序是在onMeasure之后,因为视图肯定是只有知道大小的情况下,
  85.      * 才能确定怎么摆放
  86.      */
  87.     @Override
  88.     protected void onLayout(boolean changed, int l, int t, int r, int b) {
  89.         // 记录总高度
  90.         int mTotalHeight = 0;
  91.         // 遍历所有子视图
  92.         int childCount = getChildCount();
  93.         for (int i = 0; i < childCount; i++) {
  94.             View childView = getChildAt(i);
  95.   
  96.             // 获取在onMeasure中计算的视图尺寸
  97.             int measureHeight = childView.getMeasuredHeight();
  98.             int measuredWidth = childView.getMeasuredWidth();
  99.             
  100.             childView.layout(l, mTotalHeight, measuredWidth, mTotalHeight + measureHeight);
  101.             
  102.             mTotalHeight += measureHeight;
  103.         }
  104.     }
  105. }
第二步,布局文件:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:background="#00f0f0"  
  6.     tools:context=".MainActivity" >  
  7.   
  8.     <net.loonggg.viewgroup.MyViewGroup  
  9.         android:id="@+id/myViewGroup"  
  10.         android:layout_width="480dp"  
  11.         android:layout_height="300dp"  
  12.         android:background="#0f0f0f" >  
  13.   
  14.         <TextView  
  15.             android:layout_width="200dp"  
  16.             android:layout_height="100dp"  
  17.             android:background="#000000"  
  18.             android:gravity="center"  
  19.             android:text="第一个TextView" />  
  20.   
  21.         <TextView  
  22.             android:layout_width="100dp"  
  23.             android:layout_height="200dp"  
  24.             android:background="#ffffff"  
  25.             android:gravity="center"  
  26.             android:text="第二个TextView" />  
  27.     </net.loonggg.viewgroup.MyViewGroup>  
  28.   
  29. </RelativeLayout>  

第三步,MainActivity.java:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package net.loonggg.viewgroup;

  2. import android.os.Bundle;
  3. import android.app.Activity;

  4. public class MainActivity extends Activity {
  5.     @Override
  6.     protected void onCreate(Bundle savedInstanceState) {
  7.         super.onCreate(savedInstanceState);
  8.         setContentView(R.layout.activity_main);
  9.     }
  10. }

ok,你们大家懂了吗?有问题请留言。

转自:http://blog.youkuaiyun.com/loongggdroid/article/details/17515113

Windows2008使用-解决漏洞-CVE-2010-2730 随着硬件的升级,操作系统也逐渐进行了版本更新。目前阶段,Windows2016Server、Windows2022Server逐渐成为了以Windows系列的服务器平台系统。对于有些应用而言,由于其业务的固定,可能仍只能运行在Windows2008Server或者Windows2012Server上。有时候我们为安全需要,需要将相关的操作系统涉及的漏洞做修复。最近碰到在一个Windows2008R2 的操作系统漏洞CVE-2010-2730,一顿操作,终于找到了合适的方案,这里分享给大家。 阅读详情

相关推荐

AD域控设置客户端桌面壁纸

此时再右键wallpaper文件夹,共享选项下的网络路径已经有了。找到该域下的组策略编辑器(第一步有)并按照图下所示找到桌面壁纸的策略设置,点击进去。在高级共享里可以设置共享名和同时共享的用户数量限制。点击下拉箭头,找到Everyone并选择,点击添加后,点击共享。然后可以看到刚才的新建文件夹策略在域控服务器和客户端都生效了。右键wallpaper文件夹->属性,点击共享选项,点击共享。在弹出的窗口里,按照图下所示设置,点击应用并且确认。在弹出的窗口里,按图示找到文件夹,右键新建文件夹。

欲买桂花同载酒的博客 6054

自定义View(8)关于measure->onMeasur->setMeasuredDimension及getDefaultSize,resolveSizeAndState

  参考:http://www.cnblogs.com/xiaorenwu702/p/5185436.html   当外层容器组件调用其内部的某个组件view1.measure(xxx)时,view1的onMeasure(xxx)就被调用。 1,measure--->onMeasure--->setMeasuredDimension 流程   Android通过...

banyinlve3147的博客 853

一文讲透3GPP TS 36.104发射链路相关指标

3GPP是制定移动通信标准的国际组织,其36.104规范对LTE基站射频性能提出详细要求。规范主要涵盖七方面:1)基站输出功率分类标准;2)LTE信道带宽计算方法;3)TD-LTE特有的发射机关断功率及时延要求;4)信号质量指标(频率误差和EVM)及其影响因素;5)邻道泄漏比(ACLR)的45dBc标准;6)带内频谱辐射模板(OBUE)的噪声限制;7)9kHz-12.75GHz频段的带外杂散辐射要求。这些技术要求保障了LTE基站的射频性能和网络质量。

weixin_49761275的博客 4526

onMeasure的宽高生成解析

在View的绘制流程中,onMeasure是负责测量控件的大小的@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); }他的两个参数分别代表宽和高,接下

江三沐洛的博客 1112

基于cat12和SPM12进行VBM&SBM数据分析笔记1——数据预处理

基于cat12数据分析基础教程笔记 今年是小编步入研究生生活的第一年,研究方向待定,但主要以磁共振成像为主,以后会不断地总结这方面的知识,涉及MRI扫描,数据分析基础方法理论,软件操作教程,文献阅读笔记总结等等,用来记录我的研究生三年学习过程。编写尽量简洁明了,通俗易懂,本就是小白,也能体会小白的痛。不过这也要谢谢一个人手动@小白(网名),是他教我要把自己所学的写下来,讲出来才能真正的做到输入和输出,查漏补缺。而cat12软件操作是我面临的第一个数据分析的训练,写的可能也不会非常到位,还望各位专业人士指出改

Sophia2023的博客 4万+

手把手教你用WKT文件在Petrel中创建自定义坐标系统(附CGCS2000转换模板)

本文详细介绍了如何在Petrel软件中利用WKT文件创建自定义坐标系统,并重点提供了CGCS2000坐标系的完整转换模板与实战步骤。通过解析坐标系统的三大支柱(大地坐标系、投影坐标系、基准转换)和WKT文件结构,指导用户从零开始构建适用于本土化项目的坐标系统,确保地质建模与空间数据处理的精度与一致性。

gpt4scribbler的博客 279

自定义view重写onMeasure方法自定义设置宽高,不同布局表现不一致问题分析

新来同事在学习自定义view的时候,参照书上的例子自定义了一个view: MyView.java private int getMySize(int defaultSize, int measureSpec){ int mySize = defaultSize; int mode = MeasureSpec.getMode(measureSpec); int size = MeasureSpec.getSize(measureSpec); ..

weixin_40774418的博客 1643

如何创建属于自己的大语言模型:从零开始的指南

随着人工智能的快速发展,大语言模型(LLM)在各种场景中表现出了卓越的能力,例如文本生成、对话交互和内容总结等。本文将带你了解创建 LLM 的核心步骤,从理论到实践,让你拥有一个自己的智能助手。

赵大仁的博客 3280

解决:Android 在 onMeasure 中获取不到 View 的尺寸

一、问题说明 遇到这样一个需求: 图片的宽度为接近屏幕的宽度,图片的高度要保持设计图的宽高比。 看起来很简单的一个需求是吧! 我的方案是: 我尝试在 onMeasure 中获取 ImageView 的宽度,然后根据宽度和比率计算好 View 的高度,设置上去。 问题: 页面打开时 ImageView 的 visibility 为 visible 的话不会有问题;但如果为 gone 的话,即使你设置了 visible,在 onMeasure 中获取到尺寸也是 0。 二、解决方案 i

Eric的博客 935

面试提问:数据开发中如何通过指标拆解来指导SQL编写?(附拆解模板)

摘要:指标拆解是一种高效的数据分析方法,通过将复杂业务指标分解为可执行的原子指标,指导SQL查询的编写。核心步骤包括:明确指标定义、拆解原子指标、定位数据源、确定分组维度、构建中间表。文章提供了指标拆解模板和实际案例(如用户留存率计算),并总结了拆解带来的5大好处:逻辑清晰、易于调试、可复用、降低错误率、便于协作。最后强调"一定义、二拆解、三定位、四分步、五合并"的口诀,适用于数仓开发、BI报表等场景。

石榴姐yyds 267

“双系统”出炉!瑞芯微RK3562J非对称AMP:Linux+RTOS/裸机

执行如下命令运行Linux应用程序rpmsg_echo,发送8个rpmsg数据包至运行Baremetal程序的Cortex-M0核心,当Cortex-M0核心每收到1个rpmsg数据包就会将数据包发送回Linux端。开发者可灵活分配任务或指定核心间通信,从而增强系统稳定性,减少崩溃风险,保障数据完整。下文以Cortex-A53(CPU0、CPU1、CPU2、CPU3)核心运行Linux系统与rpmsg_echo应用程序,Cortex-M0(MCU)核心运行Baremetal程序为例进行演示。

创龙,嵌入式一体化解决方案商 468

ROS 2 Kilted Kaiju:工业级可维护性升级指南

ROS 2 是面向机器人系统的中间件框架,其核心价值在于解耦通信、统一接口与跨平台协同。Kilted Kaiju 作为最新发行版,聚焦可维护性与工业落地能力,通过强化类型安全(如 rclpy 泛型支持)、构建系统现代化(target_link_libraries 替代 ament_target_dependencies)、RMW 可靠性加固(Zenoh 升级为 Tier 1)等关键演进,显著降低长期运维成本。它并非功能堆砌,而是针对真实产线场景的工程收敛——从 Windows 开发体验优化、CI/CD 兼容

weixin_33721344的博客 359

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

android 自定义viewgroup onmeasure,自定义view中 通过重写ViewGroup学习onMeasure()和onLayout()方法...

在继承ViewGroup类时,需要重写两个方法,分别是onMeasure和onLayout。1,在方法onMeasure中调用setMeasuredDimension方法void android.view.View.setMeasuredDimension(int measuredWidth, int measuredHeight)在onMeasure(int, int)中,必须调用setMeas...

weixin_34653299的博客 264

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

转:通过重写ViewGroup学习onMeasure()和onLayout()方法

转自:这里 在继承ViewGroup类时,需要重写两个方法,分别是onMeasure和onLayout。1,在方法onMeasure中调用setMeasuredDimension方法void android.view.View.setMeasuredDimension(int measuredWidth, int measuredHeight)在onMeasure(int, int)中,必须调用...

weixin_33796205的博客 80

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

自定义控件三部曲视图篇(二)——FlowLayout自适应容器实现

前言:我最大的梦想,就是有一天,等老了坐在摇椅上回望一生,有故事给孩子们讲……。 相关文章: 《Android自定义控件三部曲文章索引》:http://blog.csdn.net/harvic880925/article/details/50995268 经过上篇的铺垫,这篇就开始正式开始FlowLayout的开发啦,还是先给大家上上效果: 从效果图中可以看到,底部c...

启舰 1万+
上一篇: Android中ContentProvider的基本原理学习总结
下一篇: Android Support v4、v7、v13的区别和应用场景
HabbyGe
博客等级 码龄16年 46粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值