从Java代码中指定DIP尺寸的正确方法是什么?
我发现可以使用DIP在XML布局中设置我的界面元素的尺寸,如以下片段所示:
android:layout_width="10dip"
但是所有的Java接口都将整数作为参数,并且没有办法在DIP中指定维度。 什么是正确的方法来计算这个?
我想我必须使用DisplayMetrics
类的属性密度,但这是一个正确的方法吗?
我可以依靠这个公式总是正确的吗?
像素* DisplayMetrics.density = dip
在Android的某个地方是否有一个实用的function?
有一个现有的实用程序方法构build,称为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());
您可以使用其他types的列表,包括上面链接的页面中的COMPLEX_UNIT_SP
, COMPLEX_UNIT_PT
。 如果排除(int)types转换,你将得到浮点数。
我遇到了同样的问题,并通过查找代码来发现这个问题。
那是那里正确的公式。 尽pipeDisplayMetrics.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
使用显示指标密度字段,您可以得到一个缩放因子来转换/来自骤降。 使用Math.round方法从float转换为int,而不需要转换或添加0.5
// 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;
我认为最好的方法是不要在代码中定义任何维度,而是使用values/dimens.xml
文件。 您始终可以按照所需的单位来定义维度,如下所示:
<dimen name="my_layout_height">120dp</dimen>
然后在你的Activity中引用这个:
getResources().getDimensions(R.dimen.my_layout_height);
这将在完成必要的转换后返回像素 。 当然,你也可以在你的其他XML中引用这个:
android:layout_width="@dimen/my_layout_height"