• 最简单也最难——怎样获取到Android控件的高度


    问题

    怎样获取一个控件的长和高。相信非常多朋友第一眼看见这个问题都会认为非常easy,直接在onCreate里面调用getWidth、getMeasuredWidth不就能够获得了吗,可是。事实上是并没有简单的,不信的话,你能够去试一下,在onCreate里面,你是无法获得长宽值的,始终为0。

    原因

    这是为什么呢,事实上熟悉view绘制流程的朋友应该一眼就看出来了。在onCreate中。我们的控件事实上还并没有画好,换句话说,等onCreate方法运行完了,我们定义的控件才会被度量(measure),所以我们在onCreate方法里面通过view.getHeight()获取控件的高度或者宽度肯定是0。

    解决

    No1:

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

    这样的方法非常easy,就是我们自己来測量


    No2:

    ViewTreeObserver vto = imageView.getViewTreeObserver(); 
    	    vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
    	        public boolean onPreDraw() { 
    	        	vto.removeOnPreDrawListener(this);
    	            int height = imageView.getMeasuredHeight(); 
    	            int width = imageView.getMeasuredWidth(); 
    	            return true; 
    	        } 
    	    }); 

    这种方法。我们须要注冊一个ViewTreeObserver的监听回调,这个监听回调,就是专门监听画图的,既然是监听画图,那么我们自然能够获取測量值了,同一时候。我们在每次监听前remove前一次的监听。避免反复监听。


    No3:

    ViewTreeObserver vto = imageView.getViewTreeObserver();   
    		vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    		    @Override   
    		    public void onGlobalLayout() { 
    		        imageView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
    		        imageView.getHeight();
    		        imageView.getWidth();
    		    }   
    		});   

    这种方法于第2个方法基本同样,但他是全局的布局改变监听器,所以是最推荐使用的。


    OK。如今看来,看似简单问题也不是那么简单吧。

    以上。

  • 相关阅读:
    Java并发之synchronized关键字和Lock接口
    Java并发之volatile关键字
    浏览器的缓存机制
    垃圾回收技术
    import和require区别
    垃圾回收机制
    TCP四次挥手
    进程
    TCP基础概念
    TCP三次握手
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5221684.html
Copyright © 2020-2023  润新知