DisplayMetrics.java revision d96e3dfa02b203b1fc826e80d6f9aa074ba9c250
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.util; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackbornimport android.os.SystemProperties; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A structure describing general information about a display, such as its 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * size, density, and font scaling. 2571d4b289a7a934ecd16c3036b812d40db6d3a74dScott Main * <p>To access the DisplayMetrics members, initialize an object like this:</p> 2671d4b289a7a934ecd16c3036b812d40db6d3a74dScott Main * <pre> DisplayMetrics metrics = new DisplayMetrics(); 2771d4b289a7a934ecd16c3036b812d40db6d3a74dScott Main * getWindowManager().getDefaultDisplay().getMetrics(metrics);</pre> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class DisplayMetrics { 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 31a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn * Standard quantized DPI for low-density screens. 32a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn */ 33a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn public static final int DENSITY_LOW = 120; 34a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn 35a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn /** 36a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn * Standard quantized DPI for medium-density screens. 37a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn */ 38a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn public static final int DENSITY_MEDIUM = 160; 39a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn 40a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn /** 41b96cbbd11c4590bec846212c33361e02293f18b5Dianne Hackborn * Standard quantized DPI for 720p TV screens. Applications should 42b96cbbd11c4590bec846212c33361e02293f18b5Dianne Hackborn * generally not worry about this density, instead targeting 43b96cbbd11c4590bec846212c33361e02293f18b5Dianne Hackborn * {@link #DENSITY_XHIGH} for 1080p TV screens. For situations where 44b96cbbd11c4590bec846212c33361e02293f18b5Dianne Hackborn * output is needed for a 720p screen, the UI elements can be scaled 45b96cbbd11c4590bec846212c33361e02293f18b5Dianne Hackborn * automatically by the platform. 46b96cbbd11c4590bec846212c33361e02293f18b5Dianne Hackborn */ 47b96cbbd11c4590bec846212c33361e02293f18b5Dianne Hackborn public static final int DENSITY_TV = 213; 48b96cbbd11c4590bec846212c33361e02293f18b5Dianne Hackborn 49b96cbbd11c4590bec846212c33361e02293f18b5Dianne Hackborn /** 50a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn * Standard quantized DPI for high-density screens. 51a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn */ 52a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn public static final int DENSITY_HIGH = 240; 53a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn 54a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn /** 55a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn * Standard quantized DPI for extra-high-density screens. 56a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn */ 57a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn public static final int DENSITY_XHIGH = 320; 58a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn 59a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn /** 60d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn * Standard quantized DPI for extra-extra-high-density screens. Applications 61d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn * should not generally worry about this density; relying on XHIGH graphics 62d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn * being scaled up to it should be sufficient for almost all cases. 63d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn */ 64d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn public static final int DENSITY_XXHIGH = 480; 65d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn 66d96e3dfa02b203b1fc826e80d6f9aa074ba9c250Dianne Hackborn /** 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The reference density used throughout the system. 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 69a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn public static final int DENSITY_DEFAULT = DENSITY_MEDIUM; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 712e3d3b9ce74cb9c906e5cc0e9898d757d45c4237Mitsuru Oshima /** 722e3d3b9ce74cb9c906e5cc0e9898d757d45c4237Mitsuru Oshima * The device's density. 73a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn * @hide becase eventually this should be able to change while 74a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn * running, so shouldn't be a constant. 752e3d3b9ce74cb9c906e5cc0e9898d757d45c4237Mitsuru Oshima */ 76a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn public static final int DENSITY_DEVICE = getDeviceDensity(); 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The absolute width of the display in pixels. 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int widthPixels; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The absolute height of the display in pixels. 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int heightPixels; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The logical density of the display. This is a scaling factor for the 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Density Independent Pixel unit, where one DIP is one pixel on an 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * approximately 160 dpi screen (for example a 240x320, 1.5"x2" screen), 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * providing the baseline of the system's display. Thus on a 160dpi screen 916b13bc043e715b5415b701e93141daa0d49fa364Dirk Dougherty * this density value will be 1; on a 120 dpi screen it would be .75; etc. 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This value does not exactly follow the real screen size (as given by 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #xdpi} and {@link #ydpi}, but rather is used to scale the size of 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the overall UI in steps based on gross changes in the display dpi. For 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * example, a 240x320 screen will have a density of 1 even if its width is 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1.8", 1.3", etc. However, if the screen resolution is increased to 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 320x480 but the screen size remained 1.5"x2" then the density would be 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * increased (probably to 1.5). 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 101a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn * @see #DENSITY_DEFAULT 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float density; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * The screen density expressed as dots-per-inch. May be either 10611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * {@link #DENSITY_LOW}, {@link #DENSITY_MEDIUM}, or {@link #DENSITY_HIGH}. 10711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn */ 10811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn public int densityDpi; 10911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn /** 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A scaling factor for fonts displayed on the display. This is the same 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as {@link #density}, except that it may be adjusted in smaller 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * increments at runtime based on a user preference for the font size. 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float scaledDensity; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The exact physical pixels per inch of the screen in the X dimension. 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float xdpi; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The exact physical pixels per inch of the screen in the Y dimension. 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float ydpi; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12481e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn /** 12581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn * The reported display width prior to any compatibility mode scaling 12681e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn * being applied. 12781e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn * @hide 12881e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn */ 1292b31d53161789358de57fd396716a6503855c5daDianne Hackborn public int noncompatWidthPixels; 13081e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn /** 13181e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn * The reported display height prior to any compatibility mode scaling 13281e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn * being applied. 13381e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn * @hide 13481e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn */ 1352b31d53161789358de57fd396716a6503855c5daDianne Hackborn public int noncompatHeightPixels; 1362b31d53161789358de57fd396716a6503855c5daDianne Hackborn /** 1372b31d53161789358de57fd396716a6503855c5daDianne Hackborn * The reported display density prior to any compatibility mode scaling 1382b31d53161789358de57fd396716a6503855c5daDianne Hackborn * being applied. 1392b31d53161789358de57fd396716a6503855c5daDianne Hackborn * @hide 1402b31d53161789358de57fd396716a6503855c5daDianne Hackborn */ 1412b31d53161789358de57fd396716a6503855c5daDianne Hackborn public float noncompatDensity; 1422b31d53161789358de57fd396716a6503855c5daDianne Hackborn /** 1432b31d53161789358de57fd396716a6503855c5daDianne Hackborn * The reported scaled density prior to any compatibility mode scaling 1442b31d53161789358de57fd396716a6503855c5daDianne Hackborn * being applied. 1452b31d53161789358de57fd396716a6503855c5daDianne Hackborn * @hide 1462b31d53161789358de57fd396716a6503855c5daDianne Hackborn */ 1472b31d53161789358de57fd396716a6503855c5daDianne Hackborn public float noncompatScaledDensity; 1482b31d53161789358de57fd396716a6503855c5daDianne Hackborn /** 1492b31d53161789358de57fd396716a6503855c5daDianne Hackborn * The reported display xdpi prior to any compatibility mode scaling 1502b31d53161789358de57fd396716a6503855c5daDianne Hackborn * being applied. 1512b31d53161789358de57fd396716a6503855c5daDianne Hackborn * @hide 1522b31d53161789358de57fd396716a6503855c5daDianne Hackborn */ 1532b31d53161789358de57fd396716a6503855c5daDianne Hackborn public float noncompatXdpi; 1542b31d53161789358de57fd396716a6503855c5daDianne Hackborn /** 1552b31d53161789358de57fd396716a6503855c5daDianne Hackborn * The reported display ydpi prior to any compatibility mode scaling 1562b31d53161789358de57fd396716a6503855c5daDianne Hackborn * being applied. 1572b31d53161789358de57fd396716a6503855c5daDianne Hackborn * @hide 1582b31d53161789358de57fd396716a6503855c5daDianne Hackborn */ 1592b31d53161789358de57fd396716a6503855c5daDianne Hackborn public float noncompatYdpi; 160e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DisplayMetrics() { 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setTo(DisplayMetrics o) { 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project widthPixels = o.widthPixels; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project heightPixels = o.heightPixels; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project density = o.density; 16811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn densityDpi = o.densityDpi; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scaledDensity = o.scaledDensity; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project xdpi = o.xdpi; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ydpi = o.ydpi; 1722b31d53161789358de57fd396716a6503855c5daDianne Hackborn noncompatWidthPixels = o.noncompatWidthPixels; 1732b31d53161789358de57fd396716a6503855c5daDianne Hackborn noncompatHeightPixels = o.noncompatHeightPixels; 1742b31d53161789358de57fd396716a6503855c5daDianne Hackborn noncompatDensity = o.noncompatDensity; 1752b31d53161789358de57fd396716a6503855c5daDianne Hackborn noncompatScaledDensity = o.noncompatScaledDensity; 1762b31d53161789358de57fd396716a6503855c5daDianne Hackborn noncompatXdpi = o.noncompatXdpi; 1772b31d53161789358de57fd396716a6503855c5daDianne Hackborn noncompatYdpi = o.noncompatYdpi; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setToDefaults() { 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project widthPixels = 0; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project heightPixels = 0; 183a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn density = DENSITY_DEVICE / (float) DENSITY_DEFAULT; 18411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn densityDpi = DENSITY_DEVICE; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scaledDensity = density; 186a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn xdpi = DENSITY_DEVICE; 187a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn ydpi = DENSITY_DEVICE; 1882b31d53161789358de57fd396716a6503855c5daDianne Hackborn noncompatWidthPixels = 0; 1892b31d53161789358de57fd396716a6503855c5daDianne Hackborn noncompatHeightPixels = 0; 19058feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima } 19158feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima 19264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima @Override 19358feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima public String toString() { 19458feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima return "DisplayMetrics{density=" + density + ", width=" + widthPixels + 19558feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima ", height=" + heightPixels + ", scaledDensity=" + scaledDensity + 19658feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima ", xdpi=" + xdpi + ", ydpi=" + ydpi + "}"; 19758feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima } 1982a578ae518ff3d8a2d4768b3d190e4702509e82cDavid 'Digit' Turner 1992a578ae518ff3d8a2d4768b3d190e4702509e82cDavid 'Digit' Turner private static int getDeviceDensity() { 2002a578ae518ff3d8a2d4768b3d190e4702509e82cDavid 'Digit' Turner // qemu.sf.lcd_density can be used to override ro.sf.lcd_density 2012a578ae518ff3d8a2d4768b3d190e4702509e82cDavid 'Digit' Turner // when running in the emulator, allowing for dynamic configurations. 2022a578ae518ff3d8a2d4768b3d190e4702509e82cDavid 'Digit' Turner // The reason for this is that ro.sf.lcd_density is write-once and is 2032a578ae518ff3d8a2d4768b3d190e4702509e82cDavid 'Digit' Turner // set by the init process when it parses build.prop before anything else. 2042a578ae518ff3d8a2d4768b3d190e4702509e82cDavid 'Digit' Turner return SystemProperties.getInt("qemu.sf.lcd_density", 205a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn SystemProperties.getInt("ro.sf.lcd_density", DENSITY_DEFAULT)); 2062a578ae518ff3d8a2d4768b3d190e4702509e82cDavid 'Digit' Turner } 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 208