我发现可以在XML布局中使用DIP来设置界面元素的尺寸,例如以下代码片段:
android:layout_width="10dip"
但所有的Java接口都需要以整数作为参数,而没有办法指定DIP中的尺寸。正确的计算方法是什么?
我想我必须使用DisplayMetrics
类的密度属性,但这是正确的方式吗?
我可以依赖这个公式始终正确吗?
像素值 * DisplayMetrics.density = DIP
在Android中是否有用于转换的实用程序函数?
我发现可以在XML布局中使用DIP来设置界面元素的尺寸,例如以下代码片段:
android:layout_width="10dip"
但所有的Java接口都需要以整数作为参数,而没有办法指定DIP中的尺寸。正确的计算方法是什么?
我想我必须使用DisplayMetrics
类的密度属性,但这是正确的方式吗?
我可以依赖这个公式始终正确吗?
像素值 * DisplayMetrics.density = DIP
在Android中是否有用于转换的实用程序函数?
有一个名为TypedValue.applyDimensions(int, float, DisplayMetrics)
的实用方法可以完成此操作。
以下是如何使用它:
// returns the number of pixels for 123.4dip
int value = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
(float) 123.4, getResources().getDisplayMetrics());
在那个页面上,您可以找到一些其他类型,包括COMPLEX_UNIT_SP
和COMPLEX_UNIT_PT
。如果您不使用(int)强制转换,将得到浮点数。
我遇到了同样的问题,并通过查看代码找到了此解决方法。
那是正确的公式。虽然DisplayMetrics.density
不是静态成员,所以根据你提到的同一文档,正确的用法是:
// Maybe store this in a static field?
final float SCALE = getContext().getResources().getDisplayMetrics().density;
// Convert dips to pixels
float valueDips = 16.0f;
int valuePixels = (int)(valueDips * SCALE + 0.5f); // 0.5f for rounding
Util.dip
)将dip转换为像素以供函数调用非常简单。无论如何,用Java处理单位更加清晰。 - Roman Nurik// Converting dips to pixels
float dips = 20.0f;
float scale = getContext().getResources().getDisplayMetrics().density;
int pixels = Math.round(dips * scale);
// Converting pixels to dips
int pixels = 15;
float scale = getContext().getResources().getDisplayMetrics().density;
float dips = pixels / scale;
(int)Math.floor(a + 0.5f)
就是Math.round在底层所做的事情。 - Christopher Perry我认为最好的方法不是在代码中定义任何尺寸,而是使用values/dimens.xml
文件。您可以始终以所需单位定义自己的尺寸,例如:
<dimen name="my_layout_height">120dp</dimen>
然后在Activity中引用它,像这样:
getResources().getDimensions(R.dimen.my_layout_height);
android:layout_width="@dimen/my_layout_height"
(int)(desiredDIP * context.getResources().getDisplayMetrics().density)
。 - mxcl