Android在OnCreate中获取控件的宽度和高度的实现代码
2023-06-13 09:14:40 时间
在Android中,有时需要对控件进行测量,得到的控件宽度和高度可以用来做一些计算。在需要自适应屏幕的情况下,这种计算就显得特别重要。另一方便,由于需求的原因,希望一进入界面后,就能得到控件的宽度和高度。
可惜的是,根据我的验证,利用网上转载的那些方法在OnCreate函数中获取到的仍然是0(希望搞技术的能自己验证过再转载),例如Measure方法之后调用getMeasuredWidth的值还是0。
原因是因为当OnCreate函数发生时,只是提供了数据初始化的机会,此时还没有正式绘制图形。而绘制图形在OnDraw中进行,此时计算又显得太晚。容易想到的办法是:希望能在程序刚刚测量好某个指定控件后,拿到它的宽度和高度立刻进行计算或数据初始化。这就需要有一个方法来监听到这个事件的发生,幸好Android提供了这样的机制,利用View类中的getViewTreeObserver方法,可以获取到指定View的观察者,在绘制控件前的一刹那进行回调,这样速度上又不耽误,得到的数据由是准确的,但此方法在之后可能会被反复调用,因此需要加入限制,普通需求下,只计算一次就够了,代码如下(此代码在OnCreate回调函数中验证通过,实时上,因为它是监听器,所以发生事件时已经和OnCreate无关了):
复制代码代码如下:
可惜的是,根据我的验证,利用网上转载的那些方法在OnCreate函数中获取到的仍然是0(希望搞技术的能自己验证过再转载),例如Measure方法之后调用getMeasuredWidth的值还是0。
原因是因为当OnCreate函数发生时,只是提供了数据初始化的机会,此时还没有正式绘制图形。而绘制图形在OnDraw中进行,此时计算又显得太晚。容易想到的办法是:希望能在程序刚刚测量好某个指定控件后,拿到它的宽度和高度立刻进行计算或数据初始化。这就需要有一个方法来监听到这个事件的发生,幸好Android提供了这样的机制,利用View类中的getViewTreeObserver方法,可以获取到指定View的观察者,在绘制控件前的一刹那进行回调,这样速度上又不耽误,得到的数据由是准确的,但此方法在之后可能会被反复调用,因此需要加入限制,普通需求下,只计算一次就够了,代码如下(此代码在OnCreate回调函数中验证通过,实时上,因为它是监听器,所以发生事件时已经和OnCreate无关了):
layout=(MetroLayout)findViewById(R.id.layout);
ViewTreeObservervto=layout.getViewTreeObserver();
vto.addOnPreDrawListener(newViewTreeObserver.OnPreDrawListener()
{
publicbooleanonPreDraw()
{
if(hasMeasured==false)
{
intheight=metroLayout.getMeasuredHeight();
intwidth=metroLayout.getMeasuredWidth();
//获取到宽度和高度后,可用于计算
hasMeasured=true;
}
returntrue;
}
});
相关文章
- 代码加密 android,Android 开发怎样做代码加密或混淆「建议收藏」
- Android代码混淆技术总结(一)「建议收藏」
- android 混淆不起作用,Android代码混淆的写法总结
- Android代码混淆及调试错误「建议收藏」
- android 获取收到短信验证码,Android自动获取短信验证码
- android代码实现ScaleAnimation[通俗易懂]
- 【Android 逆向】使用 Python 代码解析 ELF 文件 ( PyCharm 中创建 Python 程序 | 导入 ELFFile 库 | 解析 ELF 文件 )
- [android]android下apk的安装过程详解手机开发
- Android使用Pull解析器解析xml文件的实现代码
- android获取屏幕像素思路及代码
- 在Android中动态添加Panel框架的实现代码
- 基于Android中dp和px之间进行转换的实现代码
- Android通过手势实现的缩放处理实例代码
- Android自定义桌面功能代码实现
- android上传文件到服务器代码实例
- android实现raw文件夹导入数据库代码
- android实现蓝牙文件发送的实例代码,支持多种机型
- android实现ScrollView自动滚动的实例代码
- 获取Android手机中所有短信的实现代码