Display.java revision 4c904a3bf3dbe98607b5e3f706ee8ef8887ee104
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.view; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.DisplayMetrics; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Display 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Specify the default Display 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int DEFAULT_DISPLAY = 0; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Use the WindowManager interface to create a Display object. 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Display gives you access to some information about a particular display 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connected to the device. 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Display(int display) { 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // initalize the statics when this class is first instansiated. This is 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // done here instead of in the static block because Zygote 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStaticInit) { 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mInitialized) { 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nativeClassInit(); 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInitialized = true; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDisplay = display; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init(display); 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 485cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * Returns the index of this display. This is currently undefined; do 495cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * not use. 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getDisplayId() { 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDisplay; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 565cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * Returns the number of displays connected to the device. This is 575cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * currently undefined; do not use. 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native static int getDisplayCount(); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 625cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * Returns the raw width of the display, in pixels. Note that this 635cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * should <em>not</em> generally be used for computing layouts, since 645cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * a device will typically have screen decoration (such as a status bar) 655cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * along the edges of the display that reduce the amount of application 665cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * space available from the raw size returned here. This value is 675cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * adjusted for you based on the current rotation of the display. 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native public int getWidth(); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 725cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * Returns the raw height of the display, in pixels. Note that this 735cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * should <em>not</em> generally be used for computing layouts, since 745cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * a device will typically have screen decoration (such as a status bar) 755cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * along the edges of the display that reduce the amount of application 765cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * space available from the raw size returned here. This value is 775cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * adjusted for you based on the current rotation of the display. 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native public int getHeight(); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 825cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * Returns the rotation of the screen from its "natural" orientation. 835cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * The returned value may be {@link Surface#ROTATION_0 Surface.ROTATION_0} 845cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * (no rotation), {@link Surface#ROTATION_90 Surface.ROTATION_90}, 855cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * {@link Surface#ROTATION_180 Surface.ROTATION_180}, or 865cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * {@link Surface#ROTATION_270 Surface.ROTATION_270}. For 875cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * example, if a device has a naturally tall screen, and the user has 885cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * turned it on its side to go into a landscape orientation, the value 895cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * returned here may be either {@link Surface#ROTATION_90 Surface.ROTATION_90} 905cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * or {@link Surface#ROTATION_270 Surface.ROTATION_270} depending on 915cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * the direction it was turned. The angle is the rotation of the drawn 925cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * graphics on the screen, which is the opposite direction of the physical 935cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * rotation of the device. For example, if the device is rotated 90 945cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * degrees counter-clockwise, to compensate rendering will be rotated by 955cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * 90 degrees clockwise and thus the returned value here will be 965cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * {@link Surface#ROTATION_90 Surface.ROTATION_90}. 975cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn */ 985cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn public int getRotation() { 995cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn return getOrientation(); 1005cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn } 1015cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn 1025cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn /** 1034c904a3bf3dbe98607b5e3f706ee8ef8887ee104Joe Onorato * @deprecated use {@link #getRotation} 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return orientation of this display. 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1065cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn @Deprecated native public int getOrientation(); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1095cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * Return the native pixel format of the display. The returned value 1105cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * may be one of the constants int {@link android.graphics.PixelFormat}. 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getPixelFormat() { 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPixelFormat; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1175cb70b54156fb305d579a1cc167424c8705bfdf7Dianne Hackborn * Return the refresh rate of this display in frames per second. 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float getRefreshRate() { 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mRefreshRate; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Initialize a DisplayMetrics object from this display's data. 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param outMetrics 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void getMetrics(DisplayMetrics outMetrics) { 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outMetrics.widthPixels = getWidth(); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outMetrics.heightPixels = getHeight(); 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outMetrics.density = mDensity; 13211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn outMetrics.densityDpi = (int)((mDensity*DisplayMetrics.DENSITY_DEFAULT)+.5f); 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outMetrics.scaledDensity= outMetrics.density; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outMetrics.xdpi = mDpiX; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outMetrics.ydpi = mDpiY; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * We use a class initializer to allow the native code to cache some 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * field offsets. 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native private static void nativeClassInit(); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void init(int display); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mDisplay; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Following fields are initialized from native code 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mPixelFormat; 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mRefreshRate; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mDensity; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mDpiX; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mDpiY; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final Object mStaticInit = new Object(); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static boolean mInitialized = false; 156ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima 157ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima /** 158ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima * Returns a display object which uses the metric's width/height instead. 159ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima * @hide 160ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima */ 161ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima public static Display createMetricsBasedDisplay(int displayId, DisplayMetrics metrics) { 162ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima return new CompatibleDisplay(displayId, metrics); 163ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima } 164ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima 165ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima private static class CompatibleDisplay extends Display { 166ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima private final DisplayMetrics mMetrics; 167ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima 168ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima private CompatibleDisplay(int displayId, DisplayMetrics metrics) { 169ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima super(displayId); 170ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima mMetrics = metrics; 171ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima } 172ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima 173ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima @Override 174ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima public int getWidth() { 175ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima return mMetrics.widthPixels; 176ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima } 177ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima 178ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima @Override 179ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima public int getHeight() { 180ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima return mMetrics.heightPixels; 181ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima } 182ddd12535f095d8d056716c3290faf50ec52a538aMitsuru Oshima } 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 185