有没有办法获取android中通知栏和标题栏的大小?目前我通过以下方式获得显示宽度和高度:
Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();
之后我想减去条形的大小,这样我就可以在不丢失宽高比的情况下拉伸视频。目前我隐藏了酒吧,因为我看不到更好的方式。
答案 0 :(得分:19)
也许这是一种有用的方法:参考Icon Design Guidelines,状态(通知)栏只有三种不同的高度,具体取决于屏幕密度:
因此,如果您使用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");
答案 1 :(得分:18)
Martin的回答指出了错误的高度(至少从SDKv11开始)。根据{{3}},状态栏图标的高度为25dp,而不是32dp。 25dp转化为这些密度特定的高度:
观察这些大小的简单方法是对具有正常密度的仿真器或设备使用hierarchyviewer。只需查看标题栏的FrameLayout getHeight()
的值即可。状态栏有点棘手,因为它是DecorView的一部分而不是视图本身,所以通过查看mTop
标题栏的FrameLayout(位于状态栏正下方)间接获得高度。根据我的观察,状态栏和标题栏各自匹配状态栏图标的25dp高度(我还没有看到SDKv11中android ref中的这个事实的声明)。
答案 2 :(得分:18)
*据我所知,这很有效。
public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}*
答案 3 :(得分:1)
嗨,我认为没有必要,如果您使用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();
答案 4 :(得分:0)
我发现一个教程可能会对你有所帮助 对你有帮助! How to increase the size of the title bar in an Android application? 你可以改变你的标题栏大小和你想要的方式,你可以得到它幸运的小伙子! 玩得开心
答案 5 :(得分:0)
抱歉虚拟评论,但使用常量作为通知栏的高度是不正确的。 只需获取全局视图(PhoneWindow $ DecorView)然后获取它的孩子(它只是一个视图(FrameLayout))。此布局包含您的应用视图并测量整个屏幕(@see FrameLayout.mHeight)。它的第一个布局将是您的第一个视图,因此获取它的top将为您提供正确的通知栏高度。使用FrameLayout没有它的上下文将不会给你任何东西,因为在你的情况下,孩子将在这种情况下等于0。
对于懒惰的人
ViewGroup decoreView = (ViewGroup)*YourActivityViewHere*.getRootView();
int barSize = ((ViewGroup)decoreView.getChildAt(0)).getChildAt(0).getTop();
您也可以使用
getWindow().getDecorView().getRootView()
而不是 YourActivityViewHere
答案 6 :(得分:0)
这比硬编码值更好用,因为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.
});
上述代码的好处在于它还会占用操作栏。
答案 7 :(得分:0)
我使用以下代码获取身高:
关于状态(通知)栏:
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;