android通知栏和标题栏的大小?

时间:2010-08-30 13:21:16

标签: android

有没有办法获取android中通知栏和标题栏的大小?目前我通过以下方式获得显示宽度和高度:

Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();

之后我想减去条形的大小,这样我就可以在不丢失宽高比的情况下拉伸视频。目前我隐藏了酒吧,因为我看不到更好的方式。

8 个答案:

答案 0 :(得分:19)

也许这是一种有用的方法:参考Icon Design Guidelines,状态(通知)栏只有三种不同的高度,具体取决于屏幕密度:

  • 24px for LDPI
  • 32px for MDPI
  • 48px for HDPI

因此,如果您使用DisplayMetricsdensityDpi检索设备的屏幕密度,您就知道要减去哪个值

所以它看起来像那样:

    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转化为这些密度特定的高度:

  • 19px for LDPI
  • 25px for MDPI
  • 38px for HDPI
  • 50px for XHDPI

观察这些大小的简单方法是对具有正常密度的仿真器或设备使用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;