如何以像素为单位获取小部件大小?
我正在使用Note 3智能手机,我拍了截图并手动计算,应该是1020px x 316px
(+ -5px),4x1widget(可调整大小)。
我试过下面的代码,但结果不对:
minW_dp=324dp, maxW_dp=439dp, minH_dp=69dp, maxH_dp=88dp.
minW=782px, maxW=1060px, minH=167px, maxH=213px.
如何以像素为单位获得小部件的实际尺寸?
public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions)
{
int minW_dp = newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH);
int maxW_dp = newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH);
int minH_dp = newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT);
int maxH_dp = newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT);
int minW = dpToPx(minW_dp, context);
int maxW = dpToPx(maxW_dp, context);
int minH = dpToPx(minH_dp, context);
int maxH = dpToPx(maxH_dp, context);
bitmap = Bitmap.createBitmap(minW, maxH, Config.ARGB_8888);
}
public static int dpToPx(int dp, Context context)
{
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
return px;
}
答案 0 :(得分:1)
您的dpToPx
计算错误。你需要改变它:
int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
到
int px = Math.round(dp * displayMetrics.density);
如果您阅读Docs,很明显为什么您的计算无效。 (注意:DisplayMetrics.xdpi似乎也在某些设备上搞砸了,请参阅this post)
遵循 displayMetrics.xdpi 代表:
X维度中每英寸屏幕的确切物理像素。
但是你不想获得屏幕每英寸的像素数。你想得到比例因子,那就是 displayMetrics.density 发挥作用:
显示器的逻辑密度。这是一个缩放因子 密度独立像素单位,其中一个DIP 一个像素 大约 160 dpi屏幕(例如240x320,1.5" x2"屏幕), 提供系统显示的基线。因此在160dpi 屏幕密度值为1 ; 120 dpi屏幕就可以了 的 0.75 强>;等
注意:注3是 xxhdpi 设备,因此比例因子为3.0(480dpi)。
另一种计算dp-> px的方法:
(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, maxH_dp, context.getResources().getDisplayMetrics());