窗口小部件大小

时间:2014-09-23 18:03:44

标签: android android-widget

如何以像素为单位获取小部件大小?

我正在使用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;
}

1 个答案:

答案 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());