Android中获取View宽高方法
来源:互联网 发布:linux cp命令文件夹 编辑:程序博客网 时间:2024/05/19 05:29
今天遇到一个问题,就是view获取宽度,高度都为0的问题,,,其实这个大家都遇到过,,,这里转载别人的,大家好共同学习。
本文转载于:http://www.jianshu.com/p/f56c92e29dea
Android开发中经常需要获取控件的宽高,比如前不久我在写一个图片加载库时,因为需要对Bitmap进行裁剪就遇到了需要获取ImageView宽高的问题。
如果稍微了解过一下View
的绘制过程,就会知道直接在onCreate()
等生命周期回调方法中获取宽高,获取到的值是0,所以我们需要采用一些特殊的方法去获取。
这里简单总结一下获取宽高的几种方法:
一、通过View.post(new Runnable())获取
这里的view可以是你需要获取宽高的View。要注意的是view
要执行此方法必须保证它已经attached到了window上,因此在此之前是不能调用这个方法的。
在Runnable
里可以执行获取宽高的方法:
view.post(new Runnable(){ @Override public void run() { int width = view.getMeasuredWidth(); int height = view.getMeasuredHeight(); }});
这个方法的原理在于:View
的宽高需要在Measure
过程后才能确定,直接在onCreate()
等回调方法里获取只能得到0,因为此时还没有开始Measure
操作。
而通过view.post()
在主线程的消息队列尾部插入了一个消息,也就是说执行获取宽高的操作被延后了,并且能够保证Measure
操作在此之前,所以就能够在这里获取到正确的宽高了。
有关为什么“能够保证Measure
操作在此之前”,我会在下一篇文章里详细分析。
另外,在网上还可以搜到其他类似方法如使用ViewTreeObserver.addOnGlobalLayout()/addOnPreDrawLayout()
或Activity/View.onWindowFocusChanged()
方法中获取的,本质也是延后了操作,等待View
初始化完毕了之后再进行获取,在这里就不细说了。
总结:
此方法优点是保证获取到的宽高是准确的;
缺点是不能及时获取到,实际上还是把操作延后了,需要在Runnable
里再执行相应回调。
二、通过LayoutParams获取
对于在XML
文件里设置了具体宽高的View
可以通过view.getLayoutParams().height/width
获取到宽高。
总结:优点是能及时获取到,且操作简单;缺点是不够通用,没有设置具体宽高的获取到的值就是0了。
三、手动Measure再获取
既然View
的宽高是在Measure
之后才能获得的,自行调用view.measure()
不就行了吗?
那么我们需要自行构造MeasureSpec
,也就是测量参数,它是一个由父容器和View
自身决定的变量。有关它的具体分析,可以阅读《Android开发艺术探索》来了解。
对于宽高设为具体数值或wrap_content
的控件,我们都可以手动构造MeasureSpec
,而match_parent
的情况理论上是做不到的。
对于设置了具体数值宽高的(比如都是100px),我们可以这样构造MeasureSpec
:
int widthMeasureSpec = MeasureSpec.makeMeasureSpec(100,MeasureSpec.EXACTLY);int heightMeasureSpec = MeasureSpec.makeMeasureSpec(100,MeasureSpec.EXACTLY);view.measure(widthMeasureSpec,heightMeasureSpec);
对于设置成wrap_content
的:
int widthMeasureSpec = MeasureSpec.makeMeasureSpec((1<<30)-1,MeasureSpec.AT_MOTST);int heightMeasureSpec = MeasureSpec.makeMeasureSpec((1<<30)-1,MeasureSpec.AT_MOST);view.measure(widthMeasureSpec,heightMeasureSpec);
总结:优点也是可以立即获取到宽高;缺点是无法解决match_parent
的情况。
作者:SamMao
链接:http://www.jianshu.com/p/f56c92e29dea
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- Android中获取View宽高方法
- Android在onCreate方法中获取view的宽高
- android中获取View宽高的方法
- Android 获取view的宽高方法
- android在oncreate()方法中获取view的宽高width,height
- Android中获取view的宽高的几种方法
- android获取view宽高的几种方法 - ysl_longer
- Android--获取View的宽高的几种方法
- Android开发显示之前获取view的宽高方法
- onCreate()方法中获取View的宽高
- Android View中通过getViewTreeObserver().addOnGlobalLayoutListener()获取控件高、宽
- android代码中获取view的宽高方式
- Android中获取View的宽/高的时机
- android获取view宽高的几种方法,解决获取高宽为0问题
- [Android]在onCreate方法中中获取View的宽和高
- android 开发中获取View视图的宽和高的几种方法
- android 开发中获取View视图的宽和高的几种方法
- android 在Activity的OnCreate()方法中如何获取view的宽和高
- Sqlite android 中文排序
- php 过滤器filter_var验证邮箱/url/ip等
- dubbo&hsf&spring-cloud简单介绍
- 关于js
- 完整ASP.Net Excel导入程序(支持2007)
- Android中获取View宽高方法
- linux---静态库与动态库的创建、生成、使用
- 【玩转数据系列十五】机器学习PAI为你自动写歌词,妈妈再也不用担心我的freestyle了(提供数据、代码)
- React 组件间通信
- 深入理解泛型(二) 协变性和逆变性
- PHP email
- reverse digits of an integer
- leetCode 系列:best time to buy and sell stock
- 实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)