Смысл масштабирования мета-виджета Android: что мне не хватает? - программирование
Подтвердить что ты не робот

Смысл масштабирования мета-виджета Android: что мне не хватает?

Я пытаюсь определить, как на видовом экране - и на содержимом внутри - влияет метатег viewport, используемый для рисования контента с помощью WebView или с родным браузером.

В чем я столкнулся, есть некоторые очевидные несоответствия. Я создал небольшую страницу (см. Ниже) с изображением и некоторым javascript для отображения размера окна просмотра, чтобы я мог визуально видеть масштабирование с изображением, а также получить точные цифры.

Во-первых, некоторые наблюдения:

  • Ни один из номеров ширины видового экрана не является точно таким, как я ожидал, только близко.
  • Когда числа близки к числу пикселей устройства, рисунок фактически выполняется один за другим - или, по крайней мере, видимо выглядит таким образом.
  • Если размер страницы (размер документа) находится под размером окна просмотра, номера в окне просмотра уменьшаются. То есть, окно просмотра не всегда обязательно представляет максимально возможное видимое пространство - просто текущее видимое пространство.
  • Аналогично, в собственном браузере размер видового экрана настраивается верхней панелью. Размер увеличивается при прокрутке экрана. Указанные цифры предназначены для полноэкранного отображения.

Устройство №1: физический экран имеет разрешение 1024x600 и работает под управлением Android 2.2.

  • initial-scale = 1.0 = > 676x400
  • initial-scale = 1.0, width = device-width = > 676x400
  • initial-scale = 2, width = device-width = > 338x200
  • initial-scale = 2, width = device-width, target-densitydpi = device-dpi = > 507x300
  • начальная шкала = 0,5, ширина = ширина устройства, target-densitydpi = device-dpi = > 800x473
  • начальная шкала = 0,9, ширина = ширина устройства, target-densitydpi = device-dpi = > 800x473
  • width = device-width, target-densitydpi = device-dpi = > 1014x600
  • начальная шкала = 1.0, ширина = ширина устройства, target-densitydpi = device-dpi = > 1014x600
  • начальная шкала = 0,5, ширина = ширина устройства, target-densitydpi = device-dpi, минимальный масштаб = 0,1 = > 2028x768
  • начальная шкала = 0,5, ширина = ширина устройства, target-densitydpi = device-dpi, минимальный масштаб = 0,1, масштабируемый пользователем = нет = > 1014x600

Устройство # 2: физический экран - 800x480 и работает под управлением Android 2.3.2.

  • initial-scale = 1.0 = > 527x320
  • initial-scale = 1.0, width = device-width = > 527x320
  • initial-scale = 2, width = device-width = > 263x160
  • initial-scale = 2, width = device-width, target-densitydpi = device-dpi = > 395x240
  • начальная шкала = 0,5, ширина = ширина устройства, target-densitydpi = device-dpi = > 790x480
  • начальная шкала = 1.0, ширина = ширина устройства, target-densitydpi = device-dpi = > 790x480
  • начальная шкала = 0,5, ширина = ширина устройства, target-densitydpi = device-dpi, минимальный масштаб = 0,1 = > 1580x768
  • начальная шкала = 0,5, ширина = ширина устройства, target-densitydpi = device-dpi, минимальный масштаб = 0,1, масштабируемый пользователем = нет = > 790x480
  • width = 1580, target-densitydpi = device-dpi = > 790x480
  • width = 1580, target-densitydpi = device-dpi = > 790x480
  • width = 1580, target-densitydpi = device-dpi, минимальная шкала = 0,1 = > 790x480

Из этих результатов следующее не имеет смысла:

  • Устройство №1, пункты 5, 6 и 10
  • Устройство № 2, пункты 5, 8, 10, 11, 12

Кто-нибудь знает, что происходит с теми, которые не имеют смысла?

Кто-нибудь знает, почему многие из значений являются 10 пикселями, застенчивыми в соответствии с физическими пикселями, но результат такой, как если бы они совпадали? (например, 1,7 и 2,6)

Я делаю что-то не так, или кажется, что невозможно увеличить масштаб за пределы 1.0, если пользователю также не разрешено масштабировать и значение минимального масштаба установлено?

То есть, хотя допустимые значения составляют от 0,01 до 10, значения начального значения ниже 1.0 игнорируются, если вы не можете установить минимальную шкалу.

Android-документы говорят, когда масштабируемость пользователя не та, что значения масштаба min/max игнорируются. Это не очень полезно. И 2.9-2.11, похоже, показывают, что вы не можете просто рассчитать его сами и установить ширину.

Наконец, HTML, который я использую:

<html>
<script src="http://code.jquery.com/jquery-1.4.4.js"></script>
<head>
    <meta name="viewport" content="initial-scale=0.5, width=device-width, target-densitydpi=device-dpi, minimum-scale=0.1, user-scalable=no" />
</head>
<body style="margin:0;">
<div id="bld" class="bld" style="position:absolute; width:250px; height:125px; left:50px; background-color:#ccccff;">Hello world.</div>
<img id="bl1" src="http://commondatastorage.googleapis.com/kf6nvr/images/1024x768.png" />
<script> 
$("#bl1").click(function(){
    var pageWidth = $(document).width();
    var pageHeight = $(document).height();
    var viewportWidth = $(window).width();
    var viewportHeight = $(window).height();

     $("#bld").html("Page width: "+pageWidth+"<br />pageHeight: "+pageHeight+"<br />port width: "+viewportWidth+"<br />port height: "+viewportHeight);
});
</script> 
</body>
</html>

Итак... что мне не хватает?

4b9b3361

Ответ 1

Интересная возможность червей, которые вы открыли там. По мере того как вы пробуете больше устройств, вы, вероятно, увидите еще более странные и случайные ошибки. Интересные времена!: -)

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

  • Используйте как можно более простые настройки.
  • Принять ширину пикселя, которую устройство хочет сообщить.
  • Полагайтесь на адаптивную/жидкую компоновку и относительную ширину, чтобы заставить вещи работать на разных ширинах экрана.
  • Используйте собственные свойства CSS для нейтральной рендеринга разрешения округлых углов, теней и градиентов.
  • Как можно больше использовать векторные форматы (svg, значки и т.д.)
  • и (important) Используйте high-res border-image, а также background-image в сочетании с хорошо поддерживаемым background-size свойство 1 чтобы сделать вещи полезными и четкими 2.

1) Чтобы обеспечить обратную совместимость с более старыми браузерами (например, MSIE8), вам нужно будет использовать объявления double background-image - например:

background-image: url(low-res.png);        /* CSS2 */
background-image: url(high-res.png), none; /* CSS3 */
background-size:  100px 10px;             /* CSS3 */

2)-webkit-max-device-pixel-ratio медиа-запрос также может помочь, но, как следует из названия, он работает только для webkit браузеров.


Бродить:

У устройств Android и iOS нового поколения есть такие разностные DPI, что они прибегают к сообщению CSS пикселей, а не фактическим пикселям устройства. Это хорошо или плохо - в зависимости от того, как вы на это смотрите.

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

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

Проблема с использованием target-densitydpi=device-dpi заключается в том, что она, когда она творит чудеса на экране с разрешением 7 дюймов в ширину 800 пикселей, полностью разрушит ваше приложение на экране размером 9 дюймов на 4 дюйма.

Ответ 2

$(document).ready(function() { 
$('meta[name=viewport]').attr('content','width=1024, user-scalable=no'); 
});

Попытайтесь работать для отключения масштабирования пользователя после применения правильного масштабирования.