java
View vBlock = findViewById(R.id.v_block);
Log.i(TAG, "vBlock left: " + vBlock.getLeft());
Log.i(TAG, "vBlock right: " + vBlock.getRight());
Log.i(TAG, "vBlock top: " + vBlock.getTop());
Log.i(TAG, "vBlock bottom: " + vBlock.getBottom());
# 输出结果
vBlock left: 0
vBlock right: 0
vBlock top: 0
vBlock bottom: 0
- 在 Android 开发中,上述代码中,getLeft、getRight、getTop、getBottom 方法返回的值都为 0
问题原因
-
getLeft、getRight、getTop、getBottom 方法返回的是视图相对于其父容器的位置坐标
-
在 onCreate 或过早的阶段调用这些方法时,视图尚未完成测量和布局流程,因此坐标值尚未计算,默认返回 0
处理策略
- 在
View.post
中打印坐标,确保视图已完成布局
java
View vBlock = findViewById(R.id.v_block);
vBlock.post(() -> {
Log.i(TAG, "vBlock left: " + vBlock.getLeft());
Log.i(TAG, "vBlock right: " + vBlock.getRight());
Log.i(TAG, "vBlock top: " + vBlock.getTop());
Log.i(TAG, "vBlock bottom: " + vBlock.getBottom());
});
# 输出结果
vBlock left: 0
vBlock right: 200
vBlock top: 49
vBlock bottom: 249
- 或者,在 onWindowFocusChanged 中打印坐标,确保视图已完成布局
java
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
View vBlock = findViewById(R.id.v_block);
Log.i(TAG, "vBlock left: " + vBlock.getLeft());
Log.i(TAG, "vBlock right: " + vBlock.getRight());
Log.i(TAG, "vBlock top: " + vBlock.getTop());
Log.i(TAG, "vBlock bottom: " + vBlock.getBottom());
}
# 输出结果
vBlock left: 0
vBlock right: 200
vBlock top: 49
vBlock bottom: 249