我有两个设备和一个带图标的片段。该图标是通过编程方式添加的,而不是在布局XML文件中添加的。在我的两个Android设备上,此图标显示为完全不同的大小(一个大,另一个小)。
我怀疑这与我指定像素长度的尺寸有关,而不是像通常在布局XML文件中那样指定尺寸像素(dp)-所以我写了一种将像素转换为dp的方法:
public static float pixelsToDp(float pixels, Context context){
return pixels / ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}
因此,使用此方法时,尺寸应为dp。这是我用来添加图标的代码:
private void addInfoIcon(Drawable infoIconDrawable) {
// CONVERT PIXEL SIZE TO DP SIZE
float infoIconSizeDp = AndroidUtils.pixelsToDp(INFO_ICON_SIZE_PX, getContext());
final ImageView ivInfoIcon = new ImageView(getContext());
ivInfoIcon.setLayoutParams(new LayoutParams((int) infoIconSizeDp, (int) infoIconSizeDp));
ivInfoIcon.setBackground(infoIconDrawable);
rlInfo.addView(ivInfoIcon);
}
这似乎没有帮助-两种设备上的图标都变小了(如预期),但大小仍然不同。
我在做什么错?感谢任何见解:)
答案 0 :(得分:1)
通常,您希望将>>> [1,2,2,3]+[1,2,3]
[1, 2, 2, 3, 1, 2, 3]
>>> [1,2,2,3]-[1,2]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'list' and 'list'
转换为dp
,而不是相反。大多数Android函数都接受px
值,而我们习惯用px
来考虑尺寸。例如,通常您会在布局文件中指定dp
,但是36dp
需要使用其参数来使用px单位,因此您需要将36 dp转换为未知数量的px。
将LayoutParams
转换为dp
的正确方法是:
px
但是,更好的方法是创建一个public static int dpToPx(int dp, Context context){
return (int) (dp * context.getResources().getDisplayMetrics().density);
}
资源并对其进行访问。这样做意味着系统将自动为您执行dp到px的转换!另外,然后您可以继续使用您熟悉的表示法(例如dimen
,和),因为不需要Java代码即可更改它并很快重新启动应用程序重新编译。
此外,您通常希望将36dp
的图像设置为视图的“源”,而不是视图的“背景”(对应于ImageView
而不是android:src
)。
放在一起,我会用这个:
android:background
:res/values/dimens.xml
<resources>
<dimen name="info_icon_size">36dp</dimen>
</resources>