有没有办法在Android中获取通知栏和标题栏的大小?目前,我通过以下方式获取显示宽度和高度:
Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();
之后,我想减去条形的大小,这样我就可以在不失去纵横比的情况下拉伸视频。目前我隐藏了这些条形,因为我找不到更好的方法。
有没有办法在Android中获取通知栏和标题栏的大小?目前,我通过以下方式获取显示宽度和高度:
Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();
之后,我想减去条形的大小,这样我就可以在不失去纵横比的情况下拉伸视频。目前我隐藏了这些条形,因为我找不到更好的方法。
也许这是一个有帮助的方法:参考图标设计指南,根据屏幕密度,状态(通知)栏只有三种不同的高度:
因此,如果使用DisplayMetrics中的densityDpi
检索设备的屏幕密度,就可以知道要减去哪个值。
所以代码看起来可能像这样:
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int myHeight = 0;
switch (metrics.densityDpi) {
case DisplayMetrics.DENSITY_HIGH:
Log.i("display", "high");
myHeight = display.getHeight() - 48;
break;
case DisplayMetrics.DENSITY_MEDIUM:
Log.i("display", "medium/default");
myHeight = display.getHeight() - 32;
break;
case DisplayMetrics.DENSITY_LOW:
Log.i("display", "low");
myHeight = display.getHeight() - 24;
break;
default:
Log.i("display", "Unknown density");
据我所知,这完全有效。
public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}*
getHeight()
值即可。状态栏有点棘手,因为它是DecorView的一部分,而不是一个单独的视图,所以通过间接查看标题栏的FrameLayout的mTop
来获取其高度,该FrameLayout紧贴着状态栏下方。从我的观察中可以得出,状态栏和标题栏都与状态栏图标的25dp高度匹配(截至SDKv11,我没有在android文档中看到这个事实的声明)。我使用以下代码获取高度:
对于状态(通知)栏:
View decorView = getWindow().getDecorView();
Rect rect = new Rect();
decorView.getWindowVisibleDisplayFrame(rect);
int statusBarHeight = rect.top;
标题栏:
View contentView = getWindow().findViewById(Window.ID_ANDROID_CONTENT);
int[] location = new int[2];
contentView.getLocationInWindow(location);
int titleBarHeight = location[1] - statusBarHeight;
嗨,我认为这不是必要的,如果您使用VideoView,它将自动完成。
VideoView vv = (VideoView) findViewById(R.id.MainVideo);
MediaController mc=new MediaController(this);
mc.setEnabled(true);
mc.show(0);
vv.setMediaController(mc);
vv.setVideoURI(Uri.parse(URLMedia));
vv.requestFocus();
vv.showContextMenu();
vv.start();
这比硬编码值要好得多,因为Android仍然会返回在特定设备上状态栏或操作栏的高度值,即使它们可能不可见。
因此,想法是获取内容视图,所有视图都添加到其中。
public View getContentView(Activity a) {
int id = a.getResources().getIdentifier("content", "id", "android");
return a.findViewById(id);
}
然后,在你的活动中
View cView = getContentView(this);
cView.post(()->{
int offsetY = cView.getTop();
// do whatever here.
});
抱歉,这是一个愚蠢的评论,但使用常量作为通知栏高度是不正确的。 只需获取全局视图(PhoneWindow$DecorView),然后获取其子视图(它将仅有一个视图(FrameLayout))。此布局包含您的应用程序视图并测量整个屏幕(请参见FrameLayout.mHeight)。其中第一个布局将是您的第一个视图,因此获取其top将给您正确的通知栏高度。在没有上下文的情况下使用FrameLayout将毫无意义,因为在这种情况下,您的子项的顶部将等于0。
对于懒惰的人:
ViewGroup decoreView = (ViewGroup)*YourActivityViewHere*.getRootView();
int barSize = ((ViewGroup)decoreView.getChildAt(0)).getChildAt(0).getTop();
你也可以使用
getWindow().getDecorView().getRootView()
使用你的活动视图代替
我找到了一个教程,也许对你有帮助。 对我来说也很有帮助啊! 如何增加 Android 应用程序中标题栏的大小? 你可以改变标题栏的大小和样式,你可以得到你想要的运气好小伙子! 玩得开心!