设为首页 加入收藏

TOP

Android获取View组件宽度以及ViewTreeObserver(一)
2018-03-02 06:57:13 】 浏览:220
Tags:Android 获取 View 组件 宽度 以及 ViewTreeObserver

View宽高测量方法:


测量方法有三种,如下:


1)(直接在onCreate()执行)


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);


2)2和3都是在onCreate()调用完后回调拿到组件的宽高


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; 
    } 
});


3)


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计算,方法二的回调函数会被多次调用。


ViewTreeObserver


一、结构


二、概述


    这是一个注册监听视图树的观察者(observer),在视图树种全局事件改变时得到通知。这个全局事件不仅还包括整个树的布局,从绘画过程开始,触摸模式的改变等。ViewTreeObserver不能够被应用程序实例化,因为它是由视图提供,参照getViewTreeObserver()以查看更多信息。


三、内部类


interface  ViewTreeObserver.OnGlobalFocusChangeListener       
//当在一个视图树中的焦点状态发生改变时,所要调用的回调函数的接口类
 
interface  ViewTreeObserver.OnGlobalLayoutListener
//当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时,所要调用的回调函数的接口类
 
interface  ViewTreeObserver.OnPreDrawListener
//当一个视图树将要绘制时,所要调用的回调函数的接口类
 
interface  ViewTreeObserver.OnScrollChangedListener
//当一个视图树中的一些组件发生滚动时,所要调用的回调函数的接口类
 
interface  ViewTreeObserver.OnTouchModeChangeListener
//当一个视图树的触摸模式发生改变时,所要调用的回调函数的接口类


四、公共方法


/**注册一个回调函数,当在一个视图树中的焦点状态发生改变时调用这个回调函数。
 * 参数 listener    将要被添加的回调函数
 *异常 IllegalStateException      如果isAlive() 返回false
*/
public void addOnGlobalFocusChangeListener (ViewTreeObserver.OnGlobalFocusChangeListener listener)
   
 
/**注册一个回调函数,当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时调用这个回调函数。
 *参数 listener    将要被添加的回调函数
 *异常 IllegalStateException      如果isAlive() 返回false
*/
public void addOnGlobalLayoutListener (ViewTreeObserver.OnGlobalLayoutListener listener)
 
  
/**注册一个回调函数,当一个视图树将要绘制时调用这个回调函数。
 *参数 listener    将要被添加的回调函数
 *异常 IllegalStateException      如果isAlive() 返回false
*/
 public void addOnPreDrawListener (ViewTreeObserver.OnPreDrawListener listener)
 
  
/**注册一个回调函数,当一个视图发生滚动时调用这个回调函数。
  *参数 listener    将要被添加的回调函数
 *异常 IllegalStateException      如果isAlive() 返回false
*/
public void addOnScrollChangedListener (ViewTreeObserver.OnScrollChange

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇JSON for Modern C++发布3.1版本 下一篇Android之使用枚举利弊及替代方案

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目