今天在重写View时遇到一个问题,在构造函数中使用getWidth()时为0,而在onDraw函数中却可以取到值。一番搜索后终于知道了原因:
所以,要想在构造函数中取得长宽,需要如下代码:
DisplayMetrics dm = new DisplayMetrics();
WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(dm);
width = dm.widthPixels/9f;// 获取屏幕分辨率宽度
height = dm.heightPixels/9f;
由于不是在Activity中获取长宽,所以需要通过mContext.getSystemService获取WindowManager,mContext可以通过构造函数传递
下面简单介绍一下WindowManager:
整个Android的窗口机制基于 WindowManager,它是全局的。这个接口可以添加view到屏幕,也可以从屏幕删除view。它面向的对象一端是屏幕,另一端就是View,直接忽略我们熟悉的Activity或者Dialog。其实Activity或者Diolog底层的实现也是通过WindowManager来完成的。