я хочу написать макет и код только один раз, чтобы он хорошо выглядел на всех устройствах. я пробовал много способов (да, включая то, что предлагает Google, использовать DP, а также добавлять несколько файлов макета), но ни один из них не решает проблему необходимости иметь дело с новой ситуацией каждый раз, когда появляется новое устройство со случайным разрешением и плотность. использование DP - это просто трюк XML, который позволяет размерам оставаться одинаковыми на всех экранах, таких как линейка (например, 1 см остается 1 см на всех экранах), поэтому это действительно не решение.
Я также использовал веса и трюки с кодом, чтобы установить правильные размеры и положения, но это слишком много работы для такой простой задачи.
Я слышал, что Google работает над решением этой проблемы, а также над фрагментацией версий для новой версии сэндвича с мороженым, но я не слышал/не читал ничего нового по этому вопросу. не только это, но и список различных плотностей и разрешений, которые должен поддерживать Android, становится все больше и больше: http://developer.android.com/guide/practices/screens_support.html
жаль, что у многих других технологий уже есть решение этой проблемы: у Apple оно есть (автоматическое масштабирование приложений с iphone 3g до iphone 4), оно есть у adobe (flash) и даже у microsoft (используя viewbox, на silverlight, wpf и WP). даже телевизоры должны справляться с этой проблемой, и они прекрасно с этим справляются.
я не прошу волшебства, просто способ все масштабировать. если вид был размером W%,H% экрана и находился на позиции X%,Y% экрана, он должен оставаться таким на всех экранах, а также позволяет нам сохранять соотношение сторон, если это важно достаточно для нас. зачем нам заморачиваться с разрешениями и плотностью? это просто сбивает с толку, как нас, так и графическую команду.
Итак, в заключение я думаю и надеюсь, что многие думают так же, как я, и, может быть, кто-то сделал хороший SDK, который решает все это?
@chubbard: DP не работает хорошо, так как он позволяет вещам оставаться одинаковыми для всех экранов, как линейка. если что-то было на 3/4 экрана, этого не будет на другом экране (это может быть даже за пределами экрана или происходить другие странные вещи, в зависимости от того, какой макет вы выбрали). DP — это фиксированное значение, которое преобразуется в пиксели на каждом устройстве только на основе плотности. так вот, за разницу между wvga800 (hdpi-480x800) и wvga854(hdpi-480x854) DP ничего не изменит, и вы получите 54 пикселя, которые вы не знаете, что с ними делать. если вы хотите поместить туда что-то для wvga854, оно не будет показано для wvga800. что еще хуже, нет никакой разницы между этими двумя экранами, когда речь идет о макетах Android — они оба относятся к одной и той же категории normal-hdpi.
Кроме того, если вы используете DP, на одном экране изображение/кнопка выглядит нормально, но на других экранах они выглядят настолько крошечными по сравнению с остальной частью экрана, что это действительно не может быть хорошим решением. я также не понимаю, почему у нас есть несколько папок с возможностью рисования, которые обычно устанавливаются в зависимости от плотности. это только увеличивает работу графических команд и делает приложение намного большего размера, чем оно есть, и из-за этого рынок может не принять его (из-за слишком большого размера) или, что еще хуже, устройства не будут иметь возможность загрузить приложение (например, старые версии ОС на Galaxy S не могут загружать и устанавливать приложения размером более 30 МБ).
@adamp: я ничего не говорил об absoluteLayout . у него точно такое же плохое поведение, которое я хочу преодолеть, как и у остальных макетов. единственный макет, который каким-то образом позволяет масштабировать, — это linearLayout (с использованием весов), но для выполнения простой задачи требуется много тегов и надписей. о том, что я хочу, я уже написал: я хочу, чтобы все масштабировалось. в Интернете есть множество примеров, где вы можете видеть, что это работает нормально, даже на флэш-памяти. просто откройте полноэкранное содержимое flash/silverlight и измените размер окна. если программист настроил все правильно, все в нем будет масштабироваться в соответствии с новым размером по сравнению с исходным размером. Кстати, спасибо за заметку о gridlayout. я не знал об этом. однако кажется, что он тоже ничего не может масштабировать.
@andreasg: вот это уже интересно. как вы обрабатывали изображения? не могли бы вы попробовать следующую "загадку" ? предположим, у вас есть изображение человеческого лица (или андроида :)), которое должно соответствовать размеру экрана (и сохранять соотношение сторон), и у вас есть другое изображение его глаз, окрашенных в другой цвет, как бы вы поместили их на один поверх другого (вероятно, с использованием фреймворка), чтобы он выглядел одинаково (в масштабе) на всех устройствах, независимо от того, находитесь ли вы в альбомном или портретном режимах?