Android и поддержка нескольких экранов - PullRequest
9 голосов
/ 25 марта 2011

Я заканчиваю приложение для Android, все, что осталось, - это адаптировать макеты пользовательского интерфейса и графику для нескольких устройств. Мне нужны определенные элементы, размещенные в определенных местах на экране.

Документы Android объясняют, как классифицируются разрешения и размеры нескольких экранов, а также объясняют систему тегов ресурсов.

Например, WVGA800 (480x800) и WVGA854 (480x854) классифицируются как обычные экраны высокой плотности. Для этого вам нужно создать папку с названием «layout» (уже присутствует для «normal») и «drawable-hdpi».

Проблема в том, что это никак не влияет на два устройства одинаковой классификации, даже если вы используете единицы измерения "dp". Как вы можете предоставить макеты / чертежи для WGA800 и WGA854 отдельно?

Соотношения достаточно различны, так что пользователь легко замечает плохое масштабирование, и это усугубляется моей потребностью в том, чтобы такие вещи, как счет и таймер, появлялись в определенном месте на фоне изображения.

Та же проблема относится к парам {WQVGA400 (240x400), WQVGA432 (240x432)} и {WVGA800 (480x800), WVGA854 (480x854)}. Как вы можете предоставить макет / рисование для WQVA400 и для WQGA432?

Ответы [ 3 ]

15 голосов
/ 25 марта 2011

Я думаю, что вы на пути в ад.

Android работает на огромном количестве устройств, каждую неделю, и многие форматы еще не существуют, но будут вводить новые переменные.Таким образом, даже если вам это удастся, одно новое устройство с немного другим размером экрана и ваше приложение выйдут из строя.

Проектирование для Android с использованием определенных разрешений экрана является ошибкой и аналогично проблемам, которые вы найдетеесли вы заставили все страницы иметь одинаковый размер в Интернете, это редко работает хорошо (например, даже аккуратный сайт фиксированной ширины с треском провалится на мобильных устройствах).

Android был разработан для поддержки всего этоговариация, но если вы пытаетесь получить идеальный по пикселям абсолютно позиционированный рендеринг на экране любого размера, вы плывете против течения.Это, вероятно, будет очень болезненным, очень трудоемким и дорогим, и, вероятно, в конечном итоге потерпит неудачу.Даже если вам это удастся, как же вы будете тестировать его на всех этих вариантах экрана?Это тоже похоже на адский тест.

Я настоятельно рекомендую вам принять, что вы не можете делать все так точно, как вам нужно, и вместо этого посмотреть, как использовать способы рендеринга объектов плавно, относительно друг друга, поэтому приложениевыглядит хорошо во всех различных вариациях, используя разные макеты для каждой группы разрешений, чтобы улучшить восприятие на экранах разных размеров.

5 голосов
/ 16 марта 2012

ДА, это возможно:

Сначала вы должны создать экземпляр класса отображения.После этого вы получите ширину и высоту дисплея.Затем вы можете проверить каждое разрешение в цикле, используя оператор if и установить желаемое изображение.

Пример:

ImageView iview=(ImageView)findViewById(R.id.imageView1);
//here are the Bitmaps optimized for each screen resolution 
Bitmap[] bitmaps={BitmapFactory.decodeResource(getResources(), R.drawable.icwvga800),BitmapFactory.decodeResource(getResources(), R.drawable.icwvga854),(...)};
// In this list all supported screensizes are defined
int[][] possibleScreenSolutions={{480,800},{480,854},{240,400},{240,432},{480,800},{480,854}};
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
int[] ScreenSolution={display.getWidth(),display.getHeight()};
// Compare the real screen solution with the all supported ones
for(int i=0;i<possibleScreenSolutions.length;i++){
    if((ScreenSolution[0]==possibleScreenSolutions[i][0])&&(ScreenSolution[1]==possibleScreenSolutions[i][1])){
            iview.setImageBitmap(bitmaps[i]);// set the image
    }
}

Я согласен с Олли С. Это слишком запутанно проверятьвсе разрешения, но это по крайней мере возможно.

Я уже все проверил: работает.

2 голосов
/ 01 апреля 2011

В дополнение к ответу / комментариям в других местах на этой странице я хотел бы опубликовать еще один ответ на свой вопрос, обратив внимание на тип экранных ресурсов, которые могут быть представлены.Я не уверен, что это ясно показано в документах по Android, но что касается рисования, вы можете добавить теги размера экрана к рисуемым файлам поверх тега dpi.

Например, добавив папку с именемdrawable-large-mdpi действует, и устройства с большими экранами и средним разрешением будут извлекать ресурсы отсюда, если смогут.Хотя предупреждение, переключение порядка тегов имеет значение: объявление drawable-mdpi-large является ошибкой.

...