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

时间:2010-01-04 17:24:58

标签: android user-interface

我在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中设置大小?

5 个答案:

答案 0 :(得分:18)

首先,您应该使用密度无关像素 - dipdp - 而非缩放像素 - sp

与密度无关的像素相当于160 dpi屏幕上的一个物理像素。如果您的资源大小为dip,则会在不同密度的屏幕上自动缩放;这就是为什么XML中指定的星星看起来没问题。缩放像素类似但仅应用于文本资源,因为它们也反映了文本缩放选项。

您的问题是您的Java代码在未缩放的原始像素中工作,这就是您的星星看起来更小的原因。 Android文档有instructions on how to convert from dips to pixels。简而言之,您需要查看android.util.DisplayMetrics.density field

答案 1 :(得分:7)

我们走吧!我需要获得DisplayMetrics密度。

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

谢谢大家指出我正确的方向!

答案 2 :(得分:6)

来自文档:

  

与比例无关的像素(sp)这就像dp单位,但它也是   按用户的字体大小缩放   偏爱。建议你使用   指定字体大小时,此单位   所以他们将调整为两个   屏幕密度和用户偏好。

这听起来像你想要用于字体大小调整,但我会使用dip来进行边距/填充:

  

密度无关像素(dip)A   应用程序的虚拟像素单元   可以用来定义他们的UI   表达布局尺寸或位置   以密度无关的方式。

答案 3 :(得分:6)

回到最初的问题:如何在Java中设置文件大小的缩放或缩放像素:

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

OR

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

答案 4 :(得分:4)

缩放像素根据用户设置的字体大小首选项而变化。

了解screen and resolution support

您还可以在此问题中找到有关dp和sp的一些有用信息:

Resolution support in Android 2.0