Android как заставить плотность экрана по умолчанию - PullRequest
0 голосов
/ 11 сентября 2018

Увеличив экран с помощью «Настройки / Дисплеи», я обнаружил, что плотность экрана моего galaxy s9 + изменяется с 430 dpi до где-то более 600 dpi.

Это позволяет изменить макет и изображения с xxhdpi на xxxhdpi.

Если у меня есть textView с фиксированным размером 16dp,

, он был 16 * 3 px в xxhdpi и станет 16 * 4 px в xxxhdpi.

Это делает мой макет (конечно, тексты из editTexts или textViews) намного больше, так как фактическая плотность устройства никогда не меняется, что Google (или создатель samsumg) предназначен для этой функции.

Но я нехочу, чтобы это происходило в моем приложении.

Я пытался исправить это, делая это;

Configuration configuration = activity.getResources().getConfiguration();

if (configuration.densityDpi != 430) { 
                configuration.densityDpi = 430;    
}

DisplayMetrics metrics = activity.getResources().getDisplayMetrics();
WindowManager wm = (WindowManager) activity.getSystemService(activity.WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(metrics);
metrics.scaledDensity = configuration.densityDpi * metrics.density;
activity.getResources().updateConfiguration(configuration, metrics);

Это заставляет плотность экрана становиться 430 и прекрасно работает на galaxy s9 +.Но, по сути, плотность по умолчанию не будет 430 для всех устройств.

Как определить плотность устройства по умолчанию для моего приложения?

Или есть конфигурация, чтобы игнорировать эффект увеличения для моего приложения?

1 Ответ

0 голосов
/ 18 апреля 2019

Кажется, это работает для меня.

        DisplayMetrics displayMetrics = activity.getResources().getDisplayMetrics();

        int snap = 20;
        float exactDpi = (displayMetrics.xdpi + displayMetrics.ydpi) / 2;
        float dpi = displayMetrics.densityDpi;

        if (dpi - exactDpi > snap) {

            int targetDpi = (int) (Math.ceil(exactDpi / snap) * snap);

            Configuration config = activity.getResources().getConfiguration();

            ErrorController.showMessage("adjustDisplayScale : " + config.densityDpi);

            ErrorController.showMessage("targetDpi : " + targetDpi);


            displayMetrics.densityDpi = targetDpi;
            config.densityDpi = targetDpi;
            displayMetrics.setTo(displayMetrics);
            config.setTo(config);
            activity.getResources().updateConfiguration(config, displayMetrics);
        }
...