我在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中设置大小?
答案 0 :(得分:18)
首先,您应该使用密度无关像素 - dip
或dp
- 而非缩放像素 - sp
。
与密度无关的像素相当于160 dpi屏幕上的一个物理像素。如果您的资源大小为dip
,则会在不同密度的屏幕上自动缩放;这就是为什么XML中指定的星星看起来没问题。缩放像素类似但仅应用于文本资源,因为它们也反映了文本缩放选项。
您的问题是您的Java代码在未缩放的原始像素中工作,这就是您的星星看起来更小的原因。 Android文档有instructions on how to convert from dip
s 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)