像素和缩放像素之间的关系是什么?

12

我在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中添加的一半。 我需要做什么才能确保所有内容都按比例缩放?

编辑: 这些都是很好的回答,但我需要知道如何从代码中解决问题。 当我设置大小时,它是以原始像素为单位的,有没有办法以dip为单位设置大小?


11
标量像素通常通过机械磨擦去除了它们身上的鱼皮质感。 - Adam Davis
5个回答

19

首先,你应该使用密度无关像素 - dipdp - 而不是缩放像素 - sp

密度无关像素相当于在160 dpi屏幕上的一个物理像素。如果你的资源是以dip为单位大小,它们将自动缩放到具有不同密度的屏幕上;这就是为什么XML中指定的星星看起来还好的原因。缩放像素类似,但仅适用于文本资源,因为它们也反映了文本缩放选项。

你的问题在于,你的Java代码正在使用未经缩放的原始像素,这就是为什么你的星星看起来更小的原因。Android文档中有关于如何从dip转换为像素的说明。简而言之,你需要查看android.util.DisplayMetrics.density字段


8

我们开始吧!我需要获取DisplayMetrics密度。

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

感谢大家指引我正确的方向!

6
回到最初的问题,如何在Java中设置文本大小为dips或缩放像素:
text.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12f);

或者

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

6

根据文档:

独立比例像素(sp)与dp单位类似,但也会根据用户的字体大小偏好进行缩放。建议在指定字体大小时使用此单位,以便为屏幕密度和用户偏好进行调整。

这听起来像是你想用于字体大小的东西,但我会在边距/填充等方面使用dip:

密度无关像素(dip)是应用程序可以在定义其UI时使用的虚拟像素单位,以以密度无关的方式表示布局尺寸或位置。


4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接