Android开发日常经验总结(1)

Posted by JamesPxy on 2017-10-24

话说今天是一年一度的程序员节,怎么能不写篇技术博客来总结一下呢,于是就诞生了Android开发日常经验总结系列文章,今天是第一期。

1.自定义View注意事项:

**android 7.0 及以上自定义view 切忌不要使用getHeight() getWidth()方法,要用 getMeasuredHeight() getMeasuredWidth()方法 **
不然初始化后首次显示会有问题 出不来自定义view的效果或者压根不能正常绘制

getMeasuredWidth()获取的是view原始的大小,也就是这个view在XML文件中配置或者是代码中设置的大小。getWidth()获取的是这个view最终显示的大小,这个大小有可能等于原始的大小也有可能不等于原始大小。

getMeasuredWidth()的值是measure阶段结束之后得到的view的原始的值

具体原因研究view对应几个方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
	/**
* Height as measured during measure pass.
* {@hide}
*/
@ViewDebug.ExportedProperty(category = "measurement")
int mMeasuredHeight;

/**
* Like {@link #getMeasuredHeightAndState()}, but only returns the
* raw width component (that is the result is masked by
* {@link #MEASURED_SIZE_MASK}).
*
* @return The raw measured height of this view.
*/
public final int getMeasuredHeight() {
return mMeasuredHeight & MEASURED_SIZE_MASK;
}

更多详细原理请戳:

2.获取屏幕高度,状态栏高度,标题栏高度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
Log.i(TAG, "onWindowFocusChanged: 666");
Rect frame = new Rect();
this.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
//顶部状态栏的高度
int statusBarHeight = frame.top;
int contentTop = this.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();
//头部标题栏高度
int titleBarHeight = contentTop - statusBarHeight;
Log.i(TAG, "initViews: statusBarHeight=" + statusBarHeight);
Log.i(TAG, "initViews: titleBarHeight=" + titleBarHeight);
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels; //屏幕宽
int height = dm.heightPixels; //屏幕高 包含状态栏和标题栏
}


支付宝打赏 微信打赏

赞赏一下