Pav*_*oda 51 layout android density-independent-pixel
我发现可以使用DIP在XML布局中设置我的界面元素的尺寸,如下面的片段所示:
android:layout_width="10dip"
Run Code Online (Sandbox Code Playgroud)
但是所有Java接口都将整数作为参数,并且无法在DIP中指定维度.计算这个的正确方法是什么?
我想我必须使用DisplayMetrics类的属性密度,但这是正确的方法吗?
我可以依靠这个公式永远正确吗?
像素*DisplayMetrics.density = dip
Android中的转换是否有实用功能?
sir*_*rhc 91
有一个现有的实用方法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());
Run Code Online (Sandbox Code Playgroud)
还有其他类型,你可以用它包括使用的名单COMPLEX_UNIT_SP, COMPLEX_UNIT_PT都在我上面链接的页面找到.如果排除(int)类型转换,您将获得浮点数.
我遇到了同样的问题,通过探索代码发现了这一点.
Rom*_*rik 45
那是正确的公式.虽然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
Run Code Online (Sandbox Code Playgroud)
小智 9
使用显示指标密度字段,您可以获得转换为/从倾角转换的比例因子.使用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;
Run Code Online (Sandbox Code Playgroud)
我认为最好的方法不是在代码中定义任何维度,而是使用该values/dimens.xml文件.您始终可以在所需的单位中定义尺寸,例如:
<dimen name="my_layout_height">120dp</dimen>
Run Code Online (Sandbox Code Playgroud)
然后在你的Activity中引用这个:
getResources().getDimensions(R.dimen.my_layout_height);
Run Code Online (Sandbox Code Playgroud)
这将在执行必要的转换后返回像素.当然,您可以在其他XML中引用这个,例如:
android:layout_width="@dimen/my_layout_height"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
40168 次 |
| 最近记录: |