Размер панели уведомлений Android и заголовка? - PullRequest
24 голосов
/ 30 августа 2010

Есть ли способ получить размер панели уведомлений и строки заголовка в Android? На данный момент я получаю ширину и высоту дисплея с помощью:

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

После этого я хочу вычесть размеры полос, чтобы я мог растянуть видео без потери соотношения сторон. В настоящее время я скрываю решетку, потому что не вижу лучшего способа.

Ответы [ 7 ]

19 голосов
/ 29 мая 2013

* Насколько я знаю, это прекрасно работает.

public int getStatusBarHeight() {
            int result = 0;
            int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
            if (resourceId > 0) {
                result = getResources().getDimensionPixelSize(resourceId);
            }
            return result;
        }*
19 голосов
/ 30 августа 2010

Может быть, это полезный подход. Ссылаясь на Руководство по проектированию иконок , для панели состояния (уведомления) в зависимости от плотности экрана есть только три разных высоты:

  • 24px для LDPI
  • 32px для MDPI
  • 48 пикселей для HDPI

Таким образом, если вы получаете плотность экрана устройства, используя densityDpi из DisplayMetrics , вы знаете, какое значение вычесть

так что это может выглядеть примерно так:

    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");
18 голосов
/ 16 июня 2011

В ответе Мартина указана неправильная высота (по крайней мере на SDKv11).В соответствии с Руководствами по проектированию иконок , значки строки состояния имеют высоту 25dp, а не 32dp.25dp переводится в следующие значения плотности:

  • 19 пикселей для LDPI
  • 25 пикселей для MDPI
  • 38 пикселей для HDPI
  • 50 пикселей для XHDPI

Простой способ наблюдать эти размеры - использовать средство просмотра иерархии против эмулятора или устройства с нормальной плотностью.Просто посмотрите на значение getHeight() для FrameLayout в строке заголовка.Строка состояния немного сложнее, потому что она является частью DecorView, а не видом сама по себе, поэтому косвенно определите ее высоту, посмотрев на mTop для FrameLayout строки заголовка, который расположен непосредственно под строкой состояния.Согласно моим наблюдениям, строка состояния и строка заголовка соответствуют высоте значков строки состояния 25dp (я не видел декларации этого факта в ссылке на Android с SDKv11).

1 голос
/ 30 августа 2010

привет, я думаю, что в этом нет необходимости, и это будет автоматически, если вы используете 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();         
0 голосов
/ 23 ноября 2017

Это работает лучше, чем жесткое кодирование, поскольку 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.
});

ХорошееС помощью приведенного выше кода также учитывается панель действий.

0 голосов
/ 11 января 2013

извините за фиктивный комментарий, но неправильно использовать константы в качестве высоты панели уведомлений. просто получите глобальное представление (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

0 голосов
/ 10 ноября 2011

Я нашел учебник, может быть, он будет вам полезен, ты! Как увеличить размер строки заголовка в приложении для Android? вы можете изменить размер строки заголовка и, как вы хотите, можете получить счастливчик!Веселись

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...