Подтвердить что ты не робот

Размер панели уведомлений android и заголовка?

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

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

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

4b9b3361

Ответ 1

Возможно, это полезный подход: ссылаясь на "Руководство по дизайну значков" , существует только три разных высоты для строки состояния (уведомления) в зависимости от плотность экрана:

  • 24px для LDPI
  • 32px для MDPI
  • 48px для 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");

Ответ 2

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

  • 19px для LDPI
  • 25px для MDPI
  • 38px для HDPI
  • 50px для XHDPI

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

Ответ 3

* Как я знаю, это работает отлично.

public int getStatusBarHeight() {
            int result = 0;
            int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
            if (resourceId > 0) {
                result = getResources().getDimensionPixelSize(resourceId);
            }
            return result;
        }*

Ответ 4

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

Ответ 6

Извините за фиктивный комментарий, но не корректно использовать константы в качестве высоты панели уведомлений. просто получите глобальный вид (PhoneWindow $DecorView), затем получите его дочерний элемент (это будет только одно представление (FrameLayout)). этот макет содержит просмотры приложений you'r и измеряет весь экран (@see FrameLayout.mHeight). первый макет его будет первым, а вот получение top даст вам правильную высоту панели уведомлений. Использование FrameLayout без контекста не принесет вам ничего, потому что в этом случае верхняя часть вашего ребенка будет равна 0.

для ленивого:

ViewGroup decoreView = (ViewGroup)*YourActivityViewHere*.getRootView();
int barSize = ((ViewGroup)decoreView.getChildAt(0)).getChildAt(0).getTop();

вы также можете использовать

getWindow().getDecorView().getRootView()

вместо параметра YourActivityViewHere

Ответ 7

Это работает waaaay лучше, чем значения hardcoding, поскольку андроид все равно вернет значение, которое будет высотой строки состояния или панели действий на этом конкретном устройстве, даже если они могут быть не видны.

Итак, идея состоит в том, чтобы получить представление контента, на которое добавлены все ваши представления.

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.
});

Хорошо с приведенным выше кодом состоит в том, что он также будет учитывать панель действий.