借鉴自开发艺术


1.onWindowFocusChanged

这个方法会被调用多次,在View初始化完毕后会调用,当Activity的窗口得到焦点和失去焦点都会被调用一次(Activity继续执行和暂停执行时)。

@Overridepublic void onWindowFocusChanged(boolean hasFocus) {    super.onWindowFocusChanged(hasFocus);    if (hasFocus) {        int width = view.getMeasuredWidth();        int height = view.getMeasuredHeight();    }}
2.view.post

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    ViewGroup root = (ViewGroup) LayoutInflater.from(this).inflate(R.layout.activity_main, null, false);    setContentView(root);    final View view = root;    view.post(new Runnable() {        @Override        public void run() {            int width = view.getMeasuredWidth();            int height = view.getMeasuredHeight();            Log.i(TAG, width + " " + height);        }    });}
具体原理暂时还不懂,不过应该是view封装的异步回调初始化后,view的测绘多半也完成了,这是一个同步的过程。所以才可以接收到消息。


3.ViewTreeObserver

他有许多回调。比如当View树的状态发生改变或者View树内部的View可见性发现改变时,onGlobalLayout方法将被回调。

final View view = root;ViewTreeObserver observer = view.getViewTreeObserver();observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {    @Override    public void onGlobalLayout() {        view.getViewTreeObserver().removeGlobalOnLayoutListener(this);        int width = view.getMeasuredWidth();        int height = view.getMeasuredHeight();        Log.i(TAG, width + " " + height);    }});
通过一种增加global listener又移除的方式,获取观察而来的消息。


4.view.measure

手动测绘,分3种情况:

一、match_parent

这个情况是获取不到的。构造这种情况的MeasureSpec需要知道父容器的剩余空间。

二、具体的数值(dp/px)

比如宽高都是100px,可以这样做:

View view = root;int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY);int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY);view.measure(widthMeasureSpec, heightMeasureSpec);Log.i(TAG, widthMeasureSpec + " " + heightMeasureSpec);
到这里为止了,这种方法不推荐,因为测出来发现有错误。

更多相关文章

  1. Android 设备网络信息的获取(网络类型、网络强度、网络速度、代理
  2. Android消息机制学习
  3. 重磅消息!Android与IOS的合体!高仿IOS动态高斯模糊背景!
  4. Android的消息提示框,ImageView,进度条
  5. 【Android】Android如何查看分区情况
  6. 微软和亚马逊在Android方面的最新消息
  7. 关于 Android 异步消息处理机制 Handler
  8. android消息机制,异步和多线程

随机推荐

  1. Android采用Linux内核的原因:
  2. Android SDK下载技巧
  3. Android使用service后台更新计划任务
  4. Android的Task和Activity(一)
  5. Android签名文件相关查看和修改
  6. Android(安卓)判断是否能真正上网(避免连
  7. android总结整理----Sqlite
  8. 布局概述之相对布局RelativeLayout
  9. Android 8.0目录介绍
  10. #Android源代码#android:onClick属性的底