android - Galaxy s3 和 AppWidgets : OnAppWidgetOptionsChanged min and max dimensions

标签 android android-widget

其他一些人发现在 Galaxy S3s 上调整 AppWidget 大小时不会调用 OnAppWidgetOptionsChanged,解决方法是在 onReceive 中捕获 com.sec.android.widgetapp.APPWIDGET_RESIZE,如此处所述:

How to catch widget size changes on devices where onAppWidgetOptionsChanged not getting called?

在这种方法中,他们从接收到的 Intent 中获取小部件的高度和宽度:

 int widgetSpanX = intent.getIntExtra("widgetspanx", 0);
 int widgetSpanY = intent.getIntExtra("widgetspany", 0);

然后将它们设置为 Bundle 作为 OPTION_APPWIDGET_MIN_HEIGHTOPTION_APPWIDGET_MIN_WIDTH 的值,随后将它们传递给对 OnAppWidgetOptionsChanged 的​​调用。

现在,我遇到的问题是,通常的 OnAppWidgetOptionsChanged 回调会为其 bundle 中的已调整大小的小部件提供最小 最大尺寸,而不仅仅是最小尺寸。这些值对应于小部件的横向和纵向模式的尺寸:

对于纵向,宽度为OPTION_APPWIDGET_MIN_WIDTH,高度为OPTION_APPWIDGET_MAX_HEIGHT

对于横向,宽度为 OPTION_APPWIDGET_MAX_WIDTH,高度为 OPTION_APPWIDGET_MIN_HEIGHT

最小和最大尺寸之间的差异可能非常大,因为横向单元格覆盖的给定区域比纵向单元格更宽和更短。我需要它们,以便在两种模式下计算出小部件的实际纵横比。

该 Intent 中是否有任何其他值可能对应于这些最小值和最大值,或者 widgetspanxwidgetspany 是唯一可用的整数值吗?

或者当您将主屏幕模式从纵向更改为横向时,s3 是否提供另一个具有不同值的 com.sec.android.widgetapp.APPWIDGET_RESIZE 事件?

不幸的是,我无法访问 S3 以便能够自己检查 Intent 。

最佳答案

好的,我找到了解决方法。

我仍然无法访问 S3,所以看不到 com.sec.android.widgetapp.APPWIDGET_RESIZE Intent 中可能还有什么,但我怀疑 Touchwiz 是只会提供跨越每个维度的单元格数量,而不是 DIP 中的实际像素边界。

这意味着我必须从这里调整 handleTouchWiz 函数:

How to catch widget size changes on devices where onAppWidgetOptionsChanged not getting called?

并自己在 DIP 中明确设置最小和最大范围。

事实证明,三星 Galaxy S5(我确实拥有)与 S3 具有相同的屏幕纵横比,只是比例更大,幸运的是,S5 主屏幕小部件单元格大小也具有与 S3 相同的纵横比。

所以我可以在 S3 的 DIP 中使用 S5 单元尺寸:

  • 在 Portrait 中,单元格为 88 * 107 DIP
  • 在 Landscape 中,单元格为 143 * 64 DIP

现在其他启动器的单元格大小可能会略有不同,特别是如果他们将单元格网格自定义为 5x6 而不是标准的 Touchwiz 4x4,但它对我来说已经足够准确了。

因此以下工作正常,允许我在对 OnAppWidgetOptionsChanged 的结果调用中得出相当准确的小部件纵横比。

private void handleTouchWiz(Context context, Intent intent) 
    {
       // Toast.makeText(context, "Calling handleTouchWiz for Samsung S3", Toast.LENGTH_SHORT).show();
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

        int appWidgetId = intent.getIntExtra("widgetId", 0);
        int widgetSpanX = intent.getIntExtra("widgetspanx", 0);
        int widgetSpanY = intent.getIntExtra("widgetspany", 0);

        if(appWidgetId > 0 && widgetSpanX > 0 && widgetSpanY > 0) 
        {
            Bundle newOptions = new Bundle();
            // We have to convert these numbers for future use
            // For Portrait
            newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH, widgetSpanX * 88);
            newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT, widgetSpanY * 107);
            // For Landscape
            newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH, widgetSpanX * 143);
            newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT, widgetSpanY * 64);

            onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions);
        }
    }

关于android - Galaxy s3 和 AppWidgets : OnAppWidgetOptionsChanged min and max dimensions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28429494/

相关文章:

android - 如何在android中使用文本编写这种类型的图标

android - 在透明形状上投下阴影?

javascript - 使用 javascript 或其他语言实现 Android 主屏幕小部件

android - 从代码启动小部件

android - 如何在android中创建水平菜单?

Android 3.2 - 在 DialogFragment 中自定义 AlertDialog 按钮

java - 使用 GSON 时将 Arraylist Value 对象添加到 JSON

java - Android点击通知打开网页

android - 在 Android 中渲染 blender 模型的最佳方式是什么?

android - 如何从我的着色器代码中替换纹理中的颜色?