blob: a43d36c14660c65c17451e210bdc7606df67bd7f [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.util;
18
Dianne Hackborne2515ee2011-04-27 18:52:56 -040019import android.os.SystemProperties;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080020
21
22/**
23 * A structure describing general information about a display, such as its
24 * size, density, and font scaling.
Scott Main71d4b282009-08-13 12:45:31 -070025 * <p>To access the DisplayMetrics members, initialize an object like this:</p>
26 * <pre> DisplayMetrics metrics = new DisplayMetrics();
27 * getWindowManager().getDefaultDisplay().getMetrics(metrics);</pre>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080028 */
29public class DisplayMetrics {
30 /**
Dianne Hackborna53b8282009-07-17 11:13:48 -070031 * Standard quantized DPI for low-density screens.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080032 */
Dianne Hackborna53b8282009-07-17 11:13:48 -070033 public static final int DENSITY_LOW = 120;
34
35 /**
36 * Standard quantized DPI for medium-density screens.
37 */
38 public static final int DENSITY_MEDIUM = 160;
39
40 /**
Dianne Hackbornb96cbbd2011-05-27 13:40:26 -070041 * Standard quantized DPI for 720p TV screens. Applications should
42 * generally not worry about this density, instead targeting
43 * {@link #DENSITY_XHIGH} for 1080p TV screens. For situations where
44 * output is needed for a 720p screen, the UI elements can be scaled
45 * automatically by the platform.
46 */
47 public static final int DENSITY_TV = 213;
48
49 /**
Dianne Hackborna53b8282009-07-17 11:13:48 -070050 * Standard quantized DPI for high-density screens.
51 */
52 public static final int DENSITY_HIGH = 240;
53
54 /**
Dianne Hackborna0b46c92010-10-21 15:32:06 -070055 * Standard quantized DPI for extra-high-density screens.
56 */
57 public static final int DENSITY_XHIGH = 320;
58
59 /**
Dianne Hackbornb663a4b2012-01-25 15:12:23 -080060 * Standard quantized DPI for extra-extra-high-density screens. Applications
61 * should not generally worry about this density; relying on XHIGH graphics
62 * being scaled up to it should be sufficient for almost all cases.
63 */
64 public static final int DENSITY_XXHIGH = 480;
65
66 /**
Dianne Hackborna53b8282009-07-17 11:13:48 -070067 * The reference density used throughout the system.
68 */
69 public static final int DENSITY_DEFAULT = DENSITY_MEDIUM;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080070
Mitsuru Oshima2e3d3b92009-05-06 15:04:28 -070071 /**
72 * The device's density.
Dianne Hackborna53b8282009-07-17 11:13:48 -070073 * @hide becase eventually this should be able to change while
74 * running, so shouldn't be a constant.
Mitsuru Oshima2e3d3b92009-05-06 15:04:28 -070075 */
Dianne Hackborna53b8282009-07-17 11:13:48 -070076 public static final int DENSITY_DEVICE = getDeviceDensity();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080077
78 /**
79 * The absolute width of the display in pixels.
80 */
81 public int widthPixels;
82 /**
83 * The absolute height of the display in pixels.
84 */
85 public int heightPixels;
86 /**
87 * The logical density of the display. This is a scaling factor for the
88 * Density Independent Pixel unit, where one DIP is one pixel on an
89 * approximately 160 dpi screen (for example a 240x320, 1.5"x2" screen),
90 * providing the baseline of the system's display. Thus on a 160dpi screen
Dirk Dougherty6b13bc02009-10-30 19:05:53 -070091 * this density value will be 1; on a 120 dpi screen it would be .75; etc.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080092 *
93 * <p>This value does not exactly follow the real screen size (as given by
94 * {@link #xdpi} and {@link #ydpi}, but rather is used to scale the size of
95 * the overall UI in steps based on gross changes in the display dpi. For
96 * example, a 240x320 screen will have a density of 1 even if its width is
97 * 1.8", 1.3", etc. However, if the screen resolution is increased to
98 * 320x480 but the screen size remained 1.5"x2" then the density would be
99 * increased (probably to 1.5).
100 *
Dianne Hackborna53b8282009-07-17 11:13:48 -0700101 * @see #DENSITY_DEFAULT
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800102 */
103 public float density;
104 /**
Dianne Hackborn11ea3342009-07-22 21:48:55 -0700105 * The screen density expressed as dots-per-inch. May be either
106 * {@link #DENSITY_LOW}, {@link #DENSITY_MEDIUM}, or {@link #DENSITY_HIGH}.
107 */
108 public int densityDpi;
109 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800110 * A scaling factor for fonts displayed on the display. This is the same
111 * as {@link #density}, except that it may be adjusted in smaller
112 * increments at runtime based on a user preference for the font size.
113 */
114 public float scaledDensity;
115 /**
116 * The exact physical pixels per inch of the screen in the X dimension.
117 */
118 public float xdpi;
119 /**
120 * The exact physical pixels per inch of the screen in the Y dimension.
121 */
122 public float ydpi;
123
Dianne Hackborn81e56d52011-05-26 00:55:58 -0700124 /**
125 * The reported display width prior to any compatibility mode scaling
126 * being applied.
127 * @hide
128 */
Dianne Hackborn2b31d532011-06-23 11:58:50 -0700129 public int noncompatWidthPixels;
Dianne Hackborn81e56d52011-05-26 00:55:58 -0700130 /**
131 * The reported display height prior to any compatibility mode scaling
132 * being applied.
133 * @hide
134 */
Dianne Hackborn2b31d532011-06-23 11:58:50 -0700135 public int noncompatHeightPixels;
136 /**
137 * The reported display density prior to any compatibility mode scaling
138 * being applied.
139 * @hide
140 */
141 public float noncompatDensity;
142 /**
143 * The reported scaled density prior to any compatibility mode scaling
144 * being applied.
145 * @hide
146 */
147 public float noncompatScaledDensity;
148 /**
149 * The reported display xdpi prior to any compatibility mode scaling
150 * being applied.
151 * @hide
152 */
153 public float noncompatXdpi;
154 /**
155 * The reported display ydpi prior to any compatibility mode scaling
156 * being applied.
157 * @hide
158 */
159 public float noncompatYdpi;
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400160
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800161 public DisplayMetrics() {
162 }
163
164 public void setTo(DisplayMetrics o) {
165 widthPixels = o.widthPixels;
166 heightPixels = o.heightPixels;
167 density = o.density;
Dianne Hackborn11ea3342009-07-22 21:48:55 -0700168 densityDpi = o.densityDpi;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800169 scaledDensity = o.scaledDensity;
170 xdpi = o.xdpi;
171 ydpi = o.ydpi;
Dianne Hackborn2b31d532011-06-23 11:58:50 -0700172 noncompatWidthPixels = o.noncompatWidthPixels;
173 noncompatHeightPixels = o.noncompatHeightPixels;
174 noncompatDensity = o.noncompatDensity;
175 noncompatScaledDensity = o.noncompatScaledDensity;
176 noncompatXdpi = o.noncompatXdpi;
177 noncompatYdpi = o.noncompatYdpi;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800178 }
179
180 public void setToDefaults() {
181 widthPixels = 0;
182 heightPixels = 0;
Dianne Hackborna53b8282009-07-17 11:13:48 -0700183 density = DENSITY_DEVICE / (float) DENSITY_DEFAULT;
Dianne Hackborn11ea3342009-07-22 21:48:55 -0700184 densityDpi = DENSITY_DEVICE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800185 scaledDensity = density;
Dianne Hackborna53b8282009-07-17 11:13:48 -0700186 xdpi = DENSITY_DEVICE;
187 ydpi = DENSITY_DEVICE;
Dianne Hackborn2b31d532011-06-23 11:58:50 -0700188 noncompatWidthPixels = 0;
189 noncompatHeightPixels = 0;
Mitsuru Oshima58feea72009-05-11 15:54:27 -0700190 }
191
Mitsuru Oshima64f59342009-06-21 00:03:11 -0700192 @Override
Mitsuru Oshima58feea72009-05-11 15:54:27 -0700193 public String toString() {
194 return "DisplayMetrics{density=" + density + ", width=" + widthPixels +
195 ", height=" + heightPixels + ", scaledDensity=" + scaledDensity +
196 ", xdpi=" + xdpi + ", ydpi=" + ydpi + "}";
197 }
David 'Digit' Turner2a578ae52009-06-18 04:30:32 +0200198
199 private static int getDeviceDensity() {
200 // qemu.sf.lcd_density can be used to override ro.sf.lcd_density
201 // when running in the emulator, allowing for dynamic configurations.
202 // The reason for this is that ro.sf.lcd_density is write-once and is
203 // set by the init process when it parses build.prop before anything else.
204 return SystemProperties.getInt("qemu.sf.lcd_density",
Dianne Hackborna53b8282009-07-17 11:13:48 -0700205 SystemProperties.getInt("ro.sf.lcd_density", DENSITY_DEFAULT));
David 'Digit' Turner2a578ae52009-06-18 04:30:32 +0200206 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800207}