Какая связь между пикселями и масштабированными пикселями

Я использовал редактор макетов в eclipse, чтобы макетировать мой макет ui, а затем создал код для его динамического заполнения, и все выглядит как разные размеры. 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. Что мне нужно сделать, чтобы убедиться, что все масштабируется надлежащим образом?

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

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

ИЛИ

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