Какая связь между пикселями и масштабированными пикселями - PullRequest
11 голосов
/ 04 января 2010

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

<ImageView
android:src="@drawable/star_gold"
android:layout_height="22sp"
android:layout_width="22sp"
android:adjustViewBounds="true"
android:layout_marginLeft="2sp"
android:layout_marginRight="2sp" />

и код Java, который я использую для этого, выглядит следующим образом:

ViewGroup.MarginLayoutParams layout = new ViewGroup.MarginLayoutParams(22, 22);
layout.setMargins(2, 0, 2, 0);
ImageView star = new ImageView(mContext);
star.setImageResource(R.drawable.star_gold);
star.setLayoutParams(layout);
star.setAdjustViewBounds(true);
holder.Stars.addView(star);

Когда я запускаю свое приложение на G1, все выстраивается и выглядит нормально, но когда я запускаю его на Droid, звезды, которые я добавляю через Java, примерно вдвое меньше тех, которые я добавляю в мой XML. Что мне нужно сделать, чтобы убедиться, что все масштабируется соответствующим образом?

Edit: Это отличные ответы, но мне нужно знать, как это сделать из кода. Когда я устанавливаю размер в необработанных пикселях, есть ли способ установить размер в dip?

Ответы [ 5 ]

18 голосов
/ 04 января 2010

Во-первых, вы должны использовать независимые от плотности пиксели - dip или dp - и не масштабированные пиксели - sp.

Плотно-независимый пиксель эквивалентен одному физическому пикселю на экране с разрешением 160 точек на дюйм. Если ваши ресурсы имеют размер dip, они автоматически масштабируются на экранах с разной плотностью; Вот почему звезды, указанные в вашем XML, выглядят нормально. Масштабированные пиксели похожи, но их следует использовать только для текстовых ресурсов, поскольку они также отражают параметры масштабирования текста.

Ваша проблема в том, что ваш Java-код работает в немасштабированных необработанных пикселях, поэтому ваши звезды выглядят меньше. В документации Android есть инструкции о том, как конвертировать из dip s в пиксели . Короче говоря, вам нужно взглянуть на android.util.DisplayMetrics.density поле .

7 голосов
/ 04 января 2010

Вот и мы! Мне нужно получить плотность DisplayMetrics.

// Convert the dips to pixels
final float scale = getContext().getResources().getDisplayMetrics().density;
mGestureThreshold = (int) (GESTURE_THRESHOLD_DIP * scale + 0.5f);

Спасибо всем за то, что указали мне правильное направление!

6 голосов
/ 14 января 2011

Возвращаясь к первоначальному вопросу о том, как установить размер текста в дипсах или масштабированных пикселях в Java:

text.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12f);

OR

text.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12f);
6 голосов
/ 04 января 2010

Из документации:

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

Звучит так, как вы хотите использовать для определения размера шрифта, но я бы использовал dip для таких вещей, как margin / padding:

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

4 голосов
/ 04 января 2010

Масштабируемые пиксели изменяются в соответствии с пользовательскими настройками размера шрифта.

Читать о поддержка экрана и разрешения .

В этом вопросе вы также найдете полезную информацию о dp и sp:

Поддержка разрешения в Android 2.0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...