获取安卓控件的大小

getMeasuredHeight()与getHeight的区别 梳理 记不清楚是做哪个项目,遇到这个问题,然后查看别人的博客,还是有点稀里糊涂的,今天自己做了一个小的demo进行验证。先把结果写出来:getHeight()方法确实反应的是view的实际高度,但是前提条件是在代码中调用view的layout()方法对view的布局进行更改,否则getHeight()和getMeasuredHeight()方法获取的值其实是一样的。有部分结论说:当view超出屏幕之后,... 阅读详情

我们都知道在onCreate()里面获取控件的高度是0,这是为什么呢?我们来看一下示例:

首先我们自己写一个控件,这个控件非常简单:

  1. public class MyImageView extends ImageView {  
  2.   
  3.     public MyImageView(Context context, AttributeSet attrs) {  
  4.         super(context, attrs);  
  5.     }  
  6.     public MyImageView(Context context) {  
  7.         super(context);  
  8.     }  
  9.       
  10.     @Override  
  11.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  12.         super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
  13.         System.out.println("onMeasure 我被调用了"+System.currentTimeMillis());  
  14.     }  
  15.       
  16.     @Override  
  17.     protected void onDraw(Canvas canvas) {  
  18.         super.onDraw(canvas);  
  19.         System.out.println("onDraw 我被调用了"+System.currentTimeMillis());  
  20.     }  
  21.   
  22. }  


布局文件:

  1. <com.test.MyImageView  
  2.     android:id="@+id/imageview"  
  3.     android:layout_width="wrap_content"  
  4.     android:layout_height="wrap_content"  
  5.     android:src="@drawable/test" />  

测试的Activity的onCreate():

  1. @Override  
  2. public void onCreate(Bundle savedInstanceState) {  
  3.     super.onCreate(savedInstanceState);  
  4.     setContentView(R.layout.main);          
  5.     System.out.println("执行完毕.."+System.currentTimeMillis());  
  6. }  
现在我们现在来看一下结果:


说明等onCreate方法执行完了,我们定义的控件才会被度量(measure),所以我们在onCreate方法里面通过view.getHeight()获取控件的高度或者宽度肯定是0,因为它自己还没有被度量,也就是说他自己都不知道自己有多高,而你这时候去获取它的尺寸,肯定是不行的.


现在碰到这个问题我们不能不解决,在网上找到了如下办法:

  1. //------------------------------------------------方法一  
  2. int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);  
  3. int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);  
  4. imageView.measure(w, h);  
  5. int height =imageView.getMeasuredHeight();  
  6. int width =imageView.getMeasuredWidth();  
  7. textView.append("\n"+height+","+width);  
  8.   
  9.   
  10.   
  11.   
  12. //-----------------------------------------------方法二  
  13. ViewTreeObserver vto = imageView.getViewTreeObserver();  
  14. vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {  
  15.     public boolean onPreDraw() {  
  16.         int height = imageView.getMeasuredHeight();  
  17.         int width = imageView.getMeasuredWidth();  
  18.         textView.append("\n"+height+","+width);  
  19.         return true;  
  20.     }  
  21. });  
  22. //-----------------------------------------------方法三     
  23. ViewTreeObserver vto2 = imageView.getViewTreeObserver();    
  24. vto2.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {  
  25.     @Override    
  26.     public void onGlobalLayout() {  
  27.         imageView.getViewTreeObserver().removeGlobalOnLayoutListener(this);    
  28.         textView.append("\n\n"+imageView.getHeight()+","+imageView.getWidth());  
  29.     }    
  30. });    

这三个方法是哪里找到现在已经忘了.


现在要讨论的是当我们需要时候使用哪个方法呢?

现在把测试的Activity改成如下:

  1. @Override  
  2.   public void onCreate(Bundle savedInstanceState) {  
  3.       super.onCreate(savedInstanceState);  
  4.       setContentView(R.layout.main);  
  5.       final ImageView imageView = (ImageView) findViewById(R.id.imageview);        
  6.         
  7.       //------------------------------------------------方法一  
  8.       int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);  
  9.       int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);  
  10.       imageView.measure(w, h);  
  11.       int height =imageView.getMeasuredHeight();  
  12.       int width =imageView.getMeasuredWidth();  
  13.       textView.append("\n"+height+","+width);  
  14.         
  15.       System.out.println("执行完毕.."+System.currentTimeMillis());  
  16.   }  



接着来看下面几种方式输出结果:

把测试Activity改成如下:

  1. @Override  
  2. public void onCreate(Bundle savedInstanceState) {  
  3.     super.onCreate(savedInstanceState);  
  4.     setContentView(R.layout.main);  
  5.     final ImageView imageView = (ImageView) findViewById(R.id.imageview);  
  6. -----------------------------------------------方法二  
  7.     ViewTreeObserver vto = imageView.getViewTreeObserver();  
  8.     vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {  
  9.         public boolean onPreDraw() {  
  10.             int height = imageView.getMeasuredHeight();  
  11.             int width = imageView.getMeasuredWidth();  
  12.             textView.append("\n"+height+","+width);  
  13.             return true;  
  14.         }  
  15.     });  
  16. }  

结果如下:



方法三就不再测试了同方法二!!!


那么方法而和方法三在执行上有什么区别呢?

我们在布局文件中加入一个TextView来记录这个控件的宽高.

  1. <ScrollView  
  2.     android:layout_width="wrap_content"  
  3.     android:layout_height="wrap_content" >  
  4.   
  5.     <TextView  
  6.         android:id="@+id/text"  
  7.         android:layout_width="wrap_content"  
  8.         android:layout_height="wrap_content" />  
  9. </ScrollView>  

先来测试方法而:

  1. @Override  
  2. public void onCreate(Bundle savedInstanceState) {  
  3.     super.onCreate(savedInstanceState);  
  4.     setContentView(R.layout.main);  
  5.     final ImageView imageView = (ImageView) findViewById(R.id.imageview);  
  6. -----------------------------------------------方法二  
  7.     ViewTreeObserver vto = imageView.getViewTreeObserver();  
  8.     vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {  
  9.         public boolean onPreDraw() {  
  10.             int height = imageView.getMeasuredHeight();  
  11.             int width = imageView.getMeasuredWidth();  
  12.             textView.append("\n"+height+","+width);  
  13.             return true;  
  14.         }  
  15.     });  
  16. }  

结果如下:



我们再来测试方法三

  1. @Override  
  2. public void onCreate(Bundle savedInstanceState) {  
  3.     super.onCreate(savedInstanceState);  
  4.     setContentView(R.layout.main);  
  5.     final ImageView imageView = (ImageView) findViewById(R.id.imageview);  
  6.     //-----------------------------------------------方法三     
  7.     ViewTreeObserver vto2 = imageView.getViewTreeObserver();    
  8.     vto2.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {  
  9.         @Override    
  10.         public void onGlobalLayout() {  
  11.             imageView.getViewTreeObserver().removeGlobalOnLayoutListener(this);    
  12.             textView.append("\n\n"+imageView.getHeight()+","+imageView.getWidth());  
  13.         }    
  14.     });    
  15. }  

输出结果如下:



我想这方法二和方法三之间的区别就不用说了吧.

  总结:那么需要获取控件的宽高该用那个方法呢?

方法一: 比其他的两个方法多了一次计算,也就是多调用了一次onMeasure()方法,该方法虽然看上去简单,但是如果要目标控件计算耗时比较大的话(如listView等),不建议使用.

方法二,它的回调方法会调用很多次,并且滑动TextView的时候任然会调用,所以不建议使用.

方法三,比较合适.

当然,实际应用的时候需要根据实际情况而定.

VS2015编译配置GDAL(图文并茂、超详细!!!) 文章目录一、GDAL介绍二、下载GDAL三、修改源代码四、工具命令提示符操作五、编译GDAL六、安装GDAL七、在VS2015的项目中配置GDAL八、添加环境变量九、测试是否配置成功 一、GDAL介绍 GDAL(Geospatial Data Abstraction Library)是一个在XMIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。OGR是GDAL项目的一个分支,功能与GDAL类似,只不过它提供对矢量数据的支持。因此 阅读详情

相关推荐

房产平台系统小程序源码

🏠 一键解锁购房新体验 🔓房产小程序 实现前端 发布二手房 租房 商品 求租 求购等信息;后台发布 新房,二手房租房 商品 写字楼 求租求购等房源信息;功能完善的一块房产小程序。

2401_84413757的博客 795

获取Android控件的宽和高

我们都知道在onCreate()里面获取控件的高度是0,这是为什么呢?我们来看一下示例: 首先我们自己写一个控件,这个控件非常简单: [java] view plaincopy public class MyImageView extends ImageView {          public MyImageView(Context

Lynn_20043745的专栏 759

C++常见面试题总结

C++常见面试题总结

xu_fu_yong的专栏 8万+

getMeasuredHeight() 和 getHeight()的区别

在Android中要经常获取控件的宽高,那么久要经常用到getMeasuredHeight()和getHeight(),那么他俩到底有什么区别呢? getMeasuredHeight() 顾名思义,就是获取控件测量后的高度,就是控件的实际高度 getHeight()是控件显示在屏幕上的高度,当控件能够在屏幕中显示完全时,二者是相等的,当控件在屏幕中显示不完全时,那么getMeasuredH

qq_21355765的博客 1243

地质工程师必备:Dips软件从数据导入到主结构面分析的完整流程解析

本文详细解析了地质工程师使用Dips软件进行主结构面分析的完整流程。从数据准备与导入、结构面分组与扇形区划分,到主结构面计算与工程解读,系统阐述了如何将野外节理数据转化为控制岩体稳定性的关键信息。重点介绍了利用等值线图识别优势组、计算统计主值及其置信椭圆,并强调了地质判断与工程应用结合的重要性。

table的专栏 341

Cadence OrCAD: 层次化设计 Hierarchical Design

详细介绍OrCAD的原理图层次化设计方法。

Fantasy237的博客 1万+

安卓view.getMeasuredHeight()得到的高度单位以及dp和px的转换

今天做个地图,不是用什么百度sdk,直接一个webview嵌入服务器的就好了 我只要传入一个分辨率做参数,因为布局默认有个title占了一部分,我要获得webview的高度和宽度,于是开始学习dp和px的转换顺便看看,于是我开始获取title的高度,突然我想安卓的view.getheight()得到的高度又是什么单位dp ?sp?px?只好自己写了个demo,结果证实,getheight()和ge

yung7086的机器人锤炼 1万+

USB_TYPE-C 母座电路设计

本文详细介绍了USB Type-C接口(C2765186)的电路设计要点,重点解析了电源、识别和数据三部分的关键连接方案。电源部分需并联VBUS和GND引脚并加宽走线以承载3A电流;识别部分必须为CC1/CC2引脚配置5.1kΩ±1%精度的下拉电阻,这是触发PD充电的核心条件;数据部分通过短接正反插引脚实现盲插功能。文档还提供了完整的引脚对照表,并强调PCB布局需注意ESD防护、差分走线阻抗控制等要点,为Type-C接口设计提供了实用指导。

在读研究生,FPGA电路设计与功能开发。 583

android计算view高度包括边距,Android布局之View.measure()动态量取高度并设置布局--(例:动态计算评论高度并显示)...

需求是这样的:在应用程序的详情介绍时,有评论的版块,该页评论最多显示5条,而每条最大字数是140个字符,每条评论可能根据字数不同,所占据的高度也不一样,如有的是1行,有的是2、3行,且评论可以翻页。图片效果如下:如何解决这样的问题呢?首先必须知道的是评论控件不要固定不变,而是需要动态计算并动态添加到显示面板中的。下面通过实例来说一下。1.定义布局定义布局的时候,可以用AbsoluteLayout,...

weixin_33021323的博客 550

从Overleaf上导出Latex论文发布到arxiv详细教程(常见问题与解决)

如果是做cv的论文请选择“Computer Vision and Pattern Recognition”,选择“Artificial Intelligence”可能会被on hold,貌似这个指的是传统的人工智能?我用公司邮箱注册发布一篇论文,一个多月还是“on hold”状态,换成edu邮箱第二天就被发布了。3、有可能是subject class选错了,编辑会帮你手动选择,然后发一封邮件告知你解除……报错缺失bbl等文件,这是因为从Menu中下载的话,是没有bbl文件的。论文被on hold。

沉迷单车的追风少年 3584

在 SAP ABAP 里可靠地对接 FTP 服务器:从连接、命令到传输与排错的完整实战

本文详细介绍了在SAP ABAP中实现FTP文件交换的完整技术方案。文章首先解析了FTP协议的双连接特性(控制连接与数据连接),强调保持控制连接的重要性。随后详细说明了ABAP中FTP操作的四步标准流程:建立连接(包含HTTP_SCRAMBLE加密)、执行命令、断开连接和关闭RFC通道。文章提供了实战案例代码,演示如何将FTP文件复制到应用服务器再读取进内表处理,特别指出后台作业与前台操作的关键差异。最后总结了常见错误排查要点,包括连接模型、路径设置和资源释放等问题。全文通过SAP标准函数模块的调用顺序、典

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 305

安卓控件获取焦点实现放大效果

-对需要放大的控件进行重写 -判断控件是否有焦点变化,有则放大动画,放大后图片最终缩小为原尺寸

luotuomianyang的博客 5137

金砖大赛-第二届网络安全防护治理实战技能大赛全国总决赛WP

格式进行md4加密,然后将小写的md4密文进行作为flag信息进行提交,提交格式为flag{MD4小写},例如调用频率异常高的user_id是user_xxx,使用的非公开模型名称是model-name,具体调用次数为10,那么按照格式,对user_xxx:model-name:10进行md4加密后,提交范例为:flag{dd00cb9e393f4a9ac639294b3cfe4d6a}挖矿木马是通过远程脚本进行部署的,请登录到失陷的服务器上,找到并分析挖矿木马是从那个远程IP下载的。

Laffrey的专栏 239

安卓控件属性知识点补缺

最近安卓控件的属性上下了点功夫研究一下,发现很多属性需要跟其他属性连用才能有预期的效果,我自己总结了一些给大家备用,废话不多少,上干货: 1、android:autoLink="all"该属性,当设置web时,自动匹配网页(如www.baidu.com),不会去匹配文字 2、minWidth最小距离的测试方式,例如:android:layout_width="wrap_content"andr...

weixin_30446197的博客 91

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LW教你自定义安卓控件之LoadingView

炫酷的安卓加载控件 自定义View实现

qq_26331127的博客 1168

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

安卓控件大小动态文字排版_动态Web排版:爆炸文字

安卓控件大小动态文字排版Lately I’ve been interested in creating motion typography for the web. Making shattered text turned out to be a combination of SVG, JavaScript and CSS, which I thought might make a useful ...

cungui5726的博客 258

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

安卓控件之使用

1.使用FrameLayout实现的布局: 2. 使用FrameLayout实现的布局: 3. ➢①如果我们直接往TableLayout中添加组件的话,那么这个组件将占满一行 ➢②如果我们想一行上有多个组件的话,就要添加一个TableRow的容器,把组 件都丢到里面 ➢③tablerow中的组件个数就决定了该行有多少列,而列的宽度由该列中最宽 的单元格决定 ➢④tablerow的layo...

guoyaqi123456的博客 189

安卓控件小技巧

测量TextView文字宽度(dp) int textWidth = tv.getPaint().measureText(tv1.getText().toString()); 让应用霸屏, 不允许切换到桌面或打开其他应用: Manifest在主Activity标签中加入: < category android:name=“android.intent.category.HOME” ...

任意层数的for循环 229

安卓控件 (一)

布局 LinearLayout 常用属性 android:id 相当于姓名 android:layout_width 宽度 android:layout_height 高度 Android:text 文字,如果是英文默认全大写 android:textAllCaps=“false” 可以关闭全大写 android:background 背景 android:layout_margin 外边距 a...

hm成长之路 299

基于android studio开发 安卓控件的基础属性1

安卓控件1. TextView控件2. Button控件2.1 控件属性2.2 控件的事件处理2.2.1 点击事件2.2.2 长按事件2.2.3 触摸事件3. EditText控件4. ImageView控件4.1 src资源4.2 scaleType属性4.3 maxHeight属性4.4 maxWidth属性4.5 adjustViewBounds属性注意事项: 1. TextView控件 设置id就可以从java内容那边取值 text设置文字内容,如果java写了被强制替换 textColor设置字

weixin_45942479的博客 988

安卓控件及布局的初步认识

一、控件 控件是用来展示一个界面的,安卓中提供了大量的UI控件,通过这些控件的组合就能够编写出一个我们想要的界面。比如:按钮、进度条、对话框、编辑栏、显示栏这些都是组件。 1、TextView(用于显示文本信息) id是给予这个控件一个标识符,是唯一的,每个控件都具有width和height属性,而属性值一般有match_parent、fill_parent以及wrap_content。...

smyx的博客 1332

关于安卓控件截图的探索(一)

安卓控件截图的探索

motosheep的博客 515

安卓控件及控件属性

一。控件的创建和获取 1.声明控件对象时,要确保类型与xml中控件的类型保持一致 2.findViewById(R.id.名)返回的是View类型的对象,需要强转类型为对应的控件类型 3.参数R.id.名要确保导入的是正确的R文件,否则会报错 二、控件的宽和高 layout_width  控件宽度 layout_height 控件高度 可以设置的值有 1.fill_parent(不常用)或mat

张小贝的博客 1050

安卓控件属性动画使用大全

首先写一个xml布局文件,用于显示效果,如下<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout

lvshaorong的博客 929

安卓控件属性

控件属性: android属性 Android功能强大,界面华丽,但是众多的布局属性就害苦了开发者,下面这篇文章结合了网上不少资料, 第一类:属性值为true或false android:layout_centerHrizontal 水平居中 (Hrizontal表示水平) android:layout_centerVertical 垂直居中 (Vertiacl表示垂直) android:l

HES_C的博客 657

安卓控件之ListView

1.如何提高listview的效率? 当converview为空时,用setTag方法为每个View绑定一个存放控件的ViewHolder对象,当converview不为空时,重复利用已创建的View时,可以通过getTag方法快速找到ViewHolder,这样避免了对控件的层层查询。代码片段如下: if (convertView == null) { hol

灵魂的世界 398
上一篇: Android Studio突然不显示logcat日志的解决办法
下一篇: android学习——MeasureSpec介绍及使用
Happy_Develop_
博客等级 码龄12年 26粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值