`
- 浏览:
152298 次
- 性别:
- 来自:
北京
-
ViewTreeObserver下有六个接口:
包含下面6个事件:
interface ViewTreeObserver.OnDrawListener
挡在一个视图树绘制时,所要调用的回调函数的接口类(level 16)
interface ViewTreeObserver.OnGlobalFocusChangeListener
当在一个视图树中的焦点状态发生改变时,所要调用的回调函数的接口类
interface ViewTreeObserver.OnGlobalLayoutListener
当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时,所要调用的回调函数的接口类
interface ViewTreeObserver.OnPreDrawListener
当一个视图树将要绘制时,所要调用的回调函数的接口类
interface ViewTreeObserver.OnScrollChangedListener
当一个视图树中的一些组件发生滚动时,所要调用的回调函数的接口类
interface ViewTreeObserver.OnTouchModeChangeListener
当一个视图树的触摸模式发生改变时,所要调用的回调函数的接口类
----------------------------------------------------------------------------------
oncreate()方法中获取控件的宽高,只会得到0,原因是oncreate()方法执行完成后控件才会被度量(measure),所以我们在onCreate方法里面通过view.getHeight()获取控件的高度或者宽度肯定是0,因为它自己还没有被度量,也就是说他自己都不知道自己有多高,而你这时候去获取它的尺寸,肯定是不行的.
解决方法:
//————————————————方法一
调用measure方法重新测量控件,从而获取宽度和高度
int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
imageView.measure(w, h);
int height =imageView.getMeasuredHeight();
int width =imageView.getMeasuredWidth();
textView.append("\n"+height+","+width);
//———————————————–方法二
在画控件之前获取宽度和高度
ViewTreeObserver vto = imageView.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
int height = imageView.getMeasuredHeight();
int width = imageView.getMeasuredWidth();
textView.append("\n"+height+","+width);
return true;
}
});
//———————————————–方法三
//控件的可视状态发生改变时,获取宽度和高度
ViewTreeObserver vto2 = imageView.getViewTreeObserver();
vto2.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
imageView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
textView.append("\n\n"+imageView.getHeight()+","+imageView.getWidth());
}
});
方法一: 比其他的两个方法多了一次计算,也就是多调用了一次onMeasure()方法,该方法虽然看上去简单,但是如果要目标控件计算耗时比较大的话(如listView等),不建议使用.
方法二,在绘制前执行回调方法,它的回调方法会调用很多次,并且滑动TextView的时候任然会调用,所以不建议使用.
方法三,当layout或控件的visibility被调用时,执行此回调
方法四:
private void measureItem(View child) {
ViewGroup.LayoutParams p = child.getLayoutParams();
if (p == null) {
p = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
}
int childWidthSpec = ViewGroup.getChildMeasureSpec(mWidthMeasureSpec,
mListPadding.left + mListPadding.right, p.width);
int lpHeight = p.height;
int childHeightSpec;
if (lpHeight > 0) {
childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight, MeasureSpec.EXACTLY);
} else {
childHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
}
child.measure(childWidthSpec, childHeightSpec);
}
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
本文实例讲述了微信小程序实现动态改变view标签宽度和高度的方法。分享给大家供大家参考,具体如下: 1、效果展示 2、关键代码 index.wxml文件 <view class=view xss=removed>我是view标签,我现在的宽度是{{view....
我们很多时候需要动态获取View的高度与宽度,可经常在代码获取的时候是0,这个时候怎么办呢,有三种获取方法
本文实例讲述了Android获取屏幕或View宽度和高度的方法。分享给大家供大家参考,具体如下: 在Activity中获取屏幕的高度和宽度 Display display=getWindowManager().getDefaultDisplay(); int width=display....
可能很多情况下,我们都会有在activity中获取view 的尺寸大小(宽度和高度)的需求。面对这种情况,很多同学立马反应:这么简单的问题,还用你说?你是不是傻。。然后立马写下getWidth()、getHeight()等方法,洋洋...
ImageView 宽度设定,高度按比例缩放
本文为大家分享了Android获取view高度的方法,供大家参考,具体内容如下 getMeasuredHeight()与getHeight的区别 ...我们知道在oncreate中View.getWidth和View.getHeight无法获得一个view的高度和宽度,
在Android中,有时需要对控件进行测量,得到的控件宽度和高度可以用来做一些计算。在需要自适应屏幕的情况下,这种计算就显得特别重要。另一方便,由于需求的原因,希望一进入界面后,就能得到控件的宽度和高度。 ...
在项目中经常要用到一个容器元素占满屏幕高度和宽度,然后再在这个容器元素里放置其他元素。 宽度很简单就是width:100% 但是高度呢,我们知道的是height:100%必须是在父元素的高度给定了的情况下才可以。 以前我的...
通过View提供的方法获取高度方式有两种: 1, 当前显示的view中直接获取当前view高宽2, 通过Activity的getWindow().findViewById(Window.ID_ANDROID_CONTENT)获取系统当前显示的 view根(是一个framelayout对象),...
概述:自定义view,实现稿纸功能,可撤消,可恢复,稿纸可设置大小和拖动,有做限制,防止内存不足的问题出现。 使用方法:将DraftView添加到布局中即可。 接口api: // 获取最大宽度 public int getDraftMaxWidth...
网页可见区域宽或高、网页正文全文宽或高以及网页正文部分左或右,详细请看下文,希望对大家有所帮助
Android OnCreate()中获取控件高度与宽度 试过在OnCreate()中获取控件高度与宽度的童鞋都知道,getWidth()与getHeight()方法返回是0,具体原因 看一下Activity的生命周期 就会明白。 上代码: 方法一: int w...
在Activity的onCreate()或者onResume()中去获得View的高度的时候不能正确获得宽度和高度信息,这是因为 View的measure过程和Activity的生命周期不是同步执行的,因此无法保证Activity执行了onCreate onStart ...
整体思路:两个界面本质是一个View,左右排列,通过一个水平滚动条来实现(示例中自定义了一个View继承自...3.获取屏幕的宽度和高度;4. 获取和设置滚动条的偏移量并实现切换的动画;5.单位换算;6.设置不显示标题。
主要介绍了Android编程获取控件宽和高的方法,结合实例形式对比总结并分析了Android控件属性的相关操作技巧,需要的朋友可以参考下
measure表示View的测量过程,用于测量View的宽度和高度;layout用于确定View在父容器的位置;draw则是负责将View绘制到屏幕中。下面主要来看一下View的Measure过程。 测量过程 View的绘制流程是从ViewRoot的...
AspectRatioLayout是一个FrameLayout,它允许设置其相对于宽度的高度,反之亦然。 您可以通过实现AspectRatioInterface并使用AspectRatioDelegate来使任何View表现为AspectRatioLayout。 ##例子 <!-- The ...