DisplayMetrics.java revision 6b13bc043e715b5415b701e93141daa0d49fa364
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 199189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshimaimport android.content.res.CompatibilityInfo; 209189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshimaimport android.content.res.Configuration; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.*; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A structure describing general information about a display, such as its 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * size, density, and font scaling. 2771d4b289a7a934ecd16c3036b812d40db6d3a74dScott Main * <p>To access the DisplayMetrics members, initialize an object like this:</p> 2871d4b289a7a934ecd16c3036b812d40db6d3a74dScott Main * <pre> DisplayMetrics metrics = new DisplayMetrics(); 2971d4b289a7a934ecd16c3036b812d40db6d3a74dScott Main * getWindowManager().getDefaultDisplay().getMetrics(metrics);</pre> 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class DisplayMetrics { 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 33a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn * Standard quantized DPI for low-density screens. 34a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn */ 35a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn public static final int DENSITY_LOW = 120; 36a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn 37a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn /** 38a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn * Standard quantized DPI for medium-density screens. 39a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn */ 40a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn public static final int DENSITY_MEDIUM = 160; 41a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn 42a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn /** 43a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn * Standard quantized DPI for high-density screens. 44a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn */ 45a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn public static final int DENSITY_HIGH = 240; 46a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn 47a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn /** 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The reference density used throughout the system. 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 50a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn public static final int DENSITY_DEFAULT = DENSITY_MEDIUM; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 522e3d3b9ce74cb9c906e5cc0e9898d757d45c4237Mitsuru Oshima /** 532e3d3b9ce74cb9c906e5cc0e9898d757d45c4237Mitsuru Oshima * The device's density. 54a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn * @hide becase eventually this should be able to change while 55a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn * running, so shouldn't be a constant. 562e3d3b9ce74cb9c906e5cc0e9898d757d45c4237Mitsuru Oshima */ 57a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn public static final int DENSITY_DEVICE = getDeviceDensity(); 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The absolute width of the display in pixels. 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int widthPixels; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The absolute height of the display in pixels. 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int heightPixels; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The logical density of the display. This is a scaling factor for the 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Density Independent Pixel unit, where one DIP is one pixel on an 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * approximately 160 dpi screen (for example a 240x320, 1.5"x2" screen), 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * providing the baseline of the system's display. Thus on a 160dpi screen 726b13bc043e715b5415b701e93141daa0d49fa364Dirk Dougherty * this density value will be 1; on a 120 dpi screen it would be .75; etc. 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This value does not exactly follow the real screen size (as given by 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #xdpi} and {@link #ydpi}, but rather is used to scale the size of 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the overall UI in steps based on gross changes in the display dpi. For 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * example, a 240x320 screen will have a density of 1 even if its width is 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1.8", 1.3", etc. However, if the screen resolution is increased to 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 320x480 but the screen size remained 1.5"x2" then the density would be 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * increased (probably to 1.5). 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 82a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn * @see #DENSITY_DEFAULT 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float density; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * The screen density expressed as dots-per-inch. May be either 8711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * {@link #DENSITY_LOW}, {@link #DENSITY_MEDIUM}, or {@link #DENSITY_HIGH}. 8811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn */ 8911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn public int densityDpi; 9011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn /** 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A scaling factor for fonts displayed on the display. This is the same 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as {@link #density}, except that it may be adjusted in smaller 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * increments at runtime based on a user preference for the font size. 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float scaledDensity; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The exact physical pixels per inch of the screen in the X dimension. 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float xdpi; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The exact physical pixels per inch of the screen in the Y dimension. 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float ydpi; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DisplayMetrics() { 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setTo(DisplayMetrics o) { 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project widthPixels = o.widthPixels; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project heightPixels = o.heightPixels; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project density = o.density; 11211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn densityDpi = o.densityDpi; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scaledDensity = o.scaledDensity; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project xdpi = o.xdpi; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ydpi = o.ydpi; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setToDefaults() { 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project widthPixels = 0; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project heightPixels = 0; 121a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn density = DENSITY_DEVICE / (float) DENSITY_DEFAULT; 12211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn densityDpi = DENSITY_DEVICE; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scaledDensity = density; 124a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn xdpi = DENSITY_DEVICE; 125a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn ydpi = DENSITY_DEVICE; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12758feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima 12858feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima /** 129e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima * Update the display metrics based on the compatibility info and orientation 130723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn * NOTE: DO NOT EXPOSE THIS API! It is introducing a circular dependency 131723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn * with the higher-level android.res package. 1329189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima * {@hide} 13358feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima */ 134723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn public void updateMetrics(CompatibilityInfo compatibilityInfo, int orientation, 135723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn int screenLayout) { 136c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn boolean expandable = compatibilityInfo.isConfiguredExpandable(); 137c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn boolean largeScreens = compatibilityInfo.isConfiguredLargeScreens(); 138c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 139c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn // Note: this assume that configuration is updated before calling 140c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn // updateMetrics method. 141c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (!expandable) { 142c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if ((screenLayout&Configuration.SCREENLAYOUT_COMPAT_NEEDED) == 0) { 143c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn expandable = true; 144c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn // the current screen size is compatible with non-resizing apps. 145c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn compatibilityInfo.setExpandable(true); 146c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } else { 14764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima compatibilityInfo.setExpandable(false); 148c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 149c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 150c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (!largeScreens) { 151c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if ((screenLayout&Configuration.SCREENLAYOUT_SIZE_MASK) 152c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn != Configuration.SCREENLAYOUT_SIZE_LARGE) { 153c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn largeScreens = true; 154c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn // the current screen size is not large. 155c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn compatibilityInfo.setLargeScreens(true); 156c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } else { 157c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn compatibilityInfo.setLargeScreens(false); 158c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 159c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 160c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 161c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (!expandable || !largeScreens) { 162c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn // This is a larger screen device and the app is not 163c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn // compatible with large screens, so diddle it. 164c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 165c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn // Figure out the compatibility width and height of the screen. 166c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn int defaultWidth; 167c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn int defaultHeight; 168c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn switch (orientation) { 169c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn case Configuration.ORIENTATION_LANDSCAPE: { 170c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn defaultWidth = (int)(CompatibilityInfo.DEFAULT_PORTRAIT_HEIGHT * density + 171c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 0.5f); 172c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn defaultHeight = (int)(CompatibilityInfo.DEFAULT_PORTRAIT_WIDTH * density + 173c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 0.5f); 174c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn break; 175723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } 176c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn case Configuration.ORIENTATION_PORTRAIT: 177c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn case Configuration.ORIENTATION_SQUARE: 178c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn default: { 179c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn defaultWidth = (int)(CompatibilityInfo.DEFAULT_PORTRAIT_WIDTH * density + 180c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 0.5f); 181c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn defaultHeight = (int)(CompatibilityInfo.DEFAULT_PORTRAIT_HEIGHT * density + 182c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 0.5f); 183c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn break; 184e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima } 185c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn case Configuration.ORIENTATION_UNDEFINED: { 186c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn // don't change 187c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn return; 188e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima } 189c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 190c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 191c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (defaultWidth < widthPixels) { 192c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn // content/window's x offset in original pixels 193c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn widthPixels = defaultWidth; 194c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 195c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (defaultHeight < heightPixels) { 196c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn heightPixels = defaultHeight; 1979189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima } 1989189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima } 19911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn 20064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima if (compatibilityInfo.isScalingRequired()) { 20164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima float invertedRatio = compatibilityInfo.applicationInvertedScale; 20264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima density *= invertedRatio; 20311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn densityDpi = (int)((density*DisplayMetrics.DENSITY_DEFAULT)+.5f); 20464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima scaledDensity *= invertedRatio; 20564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima xdpi *= invertedRatio; 20664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima ydpi *= invertedRatio; 20761324e58c549670c015010d0be14c6af76e3e9f7Mitsuru Oshima widthPixels = (int) (widthPixels * invertedRatio + 0.5f); 20861324e58c549670c015010d0be14c6af76e3e9f7Mitsuru Oshima heightPixels = (int) (heightPixels * invertedRatio + 0.5f); 20964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima } 21058feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima } 21158feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima 21264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima @Override 21358feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima public String toString() { 21458feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima return "DisplayMetrics{density=" + density + ", width=" + widthPixels + 21558feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima ", height=" + heightPixels + ", scaledDensity=" + scaledDensity + 21658feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima ", xdpi=" + xdpi + ", ydpi=" + ydpi + "}"; 21758feea74b42bbaaa0552d76af23873bdd0b5dca2Mitsuru Oshima } 2182a578ae518ff3d8a2d4768b3d190e4702509e82cDavid 'Digit' Turner 2192a578ae518ff3d8a2d4768b3d190e4702509e82cDavid 'Digit' Turner private static int getDeviceDensity() { 2202a578ae518ff3d8a2d4768b3d190e4702509e82cDavid 'Digit' Turner // qemu.sf.lcd_density can be used to override ro.sf.lcd_density 2212a578ae518ff3d8a2d4768b3d190e4702509e82cDavid 'Digit' Turner // when running in the emulator, allowing for dynamic configurations. 2222a578ae518ff3d8a2d4768b3d190e4702509e82cDavid 'Digit' Turner // The reason for this is that ro.sf.lcd_density is write-once and is 2232a578ae518ff3d8a2d4768b3d190e4702509e82cDavid 'Digit' Turner // set by the init process when it parses build.prop before anything else. 2242a578ae518ff3d8a2d4768b3d190e4702509e82cDavid 'Digit' Turner return SystemProperties.getInt("qemu.sf.lcd_density", 225a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn SystemProperties.getInt("ro.sf.lcd_density", DENSITY_DEFAULT)); 2262a578ae518ff3d8a2d4768b3d190e4702509e82cDavid 'Digit' Turner } 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 228