У меня возникли некоторые проблемы с расчетом dp для 7 "планшета (800x480px). Ниже приведен мой способ расчета. Не могу найти, где я делаю ошибку в расчете или в моей мысли:
У меня есть три устройства, которые я тестирую:
- Nexus One: 800x480 пикселей, дисплей 3,7 "( характеристики )
- Huawei Ideos: 320x240 пикселей, дисплей 2,8 "( характеристики )
- Ainol Novo 7 "Планшет: 800x480 пикселей, 7" дисплей ( характеристики )
Исходя из размера дисплея, я рассчитываю DPI (точек на дюйм) вручную на основе формул:
sqrt(w^2 + h^2) / in
Итак, я получаю:
- Nexus One: sqrt (800 * 800 + 480 * 480) /3,7 = 252,15 точек на дюйм
- Huawei Ideos: sqrt (320 * 230 + 240 * 240) /2,8 = 142,86 точек на дюйм
- Ainol Novo 7 "Планшет: sqrt (800 * 800 + 480 * 480) / 7 = 133,28 дп
Теперь я хочу вывести значение dpi для метрик экрана и, исходя из этого, ширину и высоту экрана в dp (пикселях, не зависящих от плотности). Мой код для этого:
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
Log.d(TAG, "ScaledDensity: " + metrics.scaledDensity);
Log.d(TAG, "Density DPI: " + metrics.densityDpi);
int widthInPx = 800; // 320 or 800, depending on the respective device width I'm testing
int widthInDp =(int)(widthInPx/metrics.scaledDensity);
Log.d(TAG, "width in dp: " + widthInDp);
int heightInPx = 480; // 240 or 480, depending on the respective device height I'm testing
int heightInDp =(int)(heightInPx/metrics.scaledDensity);
Log.d(TAG, "height in dp: " + heightInDp);
Результаты следующие:
- Nexus One:
Масштабная плотность: 1,5, плотность DPI: 240, Ширина в dp: 533, Высота в dp: 320
- Идеи Huawei:
ScaledDensity: 0,75, плотность DPI: 120, ширина в dp: 426, высота в dp: 320
- Ainol Novo 7 "планшет:
ScaledDensity: 1.0, плотность DPI: 160, ширина в dp: 800, высота в dp: 480
DPI плотности, которые я получаю из java-кода внутри своей деятельности, отличаются от моих вычисленных значений dpi и, очевидно, округляются Android до одного из значений 120, 160 или 240, что вполне нормально. Пока проблем нет.
Задача / Вопрос 1:
С третьим устройством, планшетом Novo 7 ":
Считается, что ScaledDensity равен 1,0, а ширина в dp равна 800 , что соответствует числу пикселей. Однако это не реальность; когда я создаю полноэкранное приложение и размещаю там представление, только 533dp x 320dp вида фактически помещается на экран . Так что это те же измерения dp, что и у Nexus One; даже если у Nexus One более высокое значение DPI, но такое же количество пикселей. Как это возможно?
Проблема / Вопрос 2:
Я создаю AVD для эмулятора, с точными измерениями, как у планшета Novo 7 ".
Строки журнала в моем коде Java показывают те же значения, что и для реального планшетного устройства:
- Ainol Novo 7 "планшет Эмулятор :
ScaledDensity: 1.0, плотность DPI: 160, ширина в dp: 800, высота в dp: 480
Однако в эмуляторе я могу разместить вид с 580dp x 320 dp, чтобы он был полностью виден в полноэкранном режиме. Как это возможно, что ширина dp отличается между эмулятором и реальным устройством с одинаковыми измерениями?
Проблема / Вопрос 3:
На http://developer.android.com/guide/practices/screens_support.html написано:
Чтобы помочь вам нацелить некоторые из ваших дизайнов для различных типов
устройств, вот некоторые цифры для типичной ширины экрана:
...
480 точек на дюйм: планшет-миниатюра типа Streak (480x800 точек на дюйм).
600 точек на дюйм: 7-дюймовый планшет (600x1024 точек на дюйм).
...
Я предполагаю, что мой планшет должен попадать в одну из этих категорий, однако, он не имеет ширины 480 и 600 dp, но что-то среднее; в моем случае 533dp (реальное устройство) или 580dp (эмулятор).
Если это так, то чем полезен такой обзор «типичной ширины экрана», если на самом деле это не так, но устройства разных поставщиков могут иметь любое другое случайное значение между стандартные?
Тогда я мог бы просто вернуться и снова работать с пиксельными значениями, поскольку полное преимущество использования dp, по-видимому, отсутствует.