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

Cas*_*eyB 11 user-interface android

我在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" />
Run Code Online (Sandbox Code Playgroud)

我用来做同样事情的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);
Run Code Online (Sandbox Code Playgroud)

当我在G1上运行我的应用程序时,一切都排好了,但是当我在Droid上运行时,我通过Java添加的星星大约是我在XML中添加的星号的一半.我需要做些什么来确保所有内容都适当缩放?

编辑:这些是很好的回复,但我需要知道如何从代码中做到这一点.当我设置原始像素的大小时,有没有办法设置dip的大小?

Dav*_*ebb 18

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

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

您的问题是您的Java代码在未缩放的原始像素中工作,这就是您的星星看起来更小的原因.Android文档提供了有关如何从dips 转换为像素的说明.简而言之,你需要看看这个android.util.DisplayMetrics.density领域.


Cas*_*eyB 7

开始了!我需要获得DisplayMetrics密度.

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

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


Mar*_*k B 6

从文档:

与比例无关的像素(sp)这与dp单位类似,但它也会根据用户的字体大小首选项进行缩放.建议您在指定字体大小时使用此单位,以便根据屏幕密度和用户偏好调整它们.

这听起来像你想要用于字体大小调整,但我会使用dip作为margin/padding之类的东西:

密度独立像素(dip)应用程序可用于定义UI,以与密度无关的方式表达布局尺寸或位置的虚拟像素单元.


小智 6

回到最初的问题,你如何在Java中以dips或缩放像素设置文本大小:

text.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12f);
Run Code Online (Sandbox Code Playgroud)

要么

text.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12f);
Run Code Online (Sandbox Code Playgroud)