Android RemoteViews,如何在小部件中设置ImageView的ScaleType?

56
我正在开发一个小部件,右侧带有一张图片,用户可以在其中一个设置屏幕中选择。然后,用户可以使用 ImageView.setScaleType("CENTER") 将图像设置为自己想要的大小。这很有效。
图像的 URL 以及作为 Bitmap 的 Base64 编码字符串存储在首选项中(因为我想缩小图片并且用户可以在设置中旋转它)。
在小部件中,我加载了该图像。URI 以及 Bitmap 都可以正常工作。ImageView 的 ScaleType 在布局中也已经设置为固定值,也可以正常工作。
但是我该如何在小部件程序中编程定义 ImageView 的 ScaleType 呢?因为我想根据用户在设置中选择的值来设置 ScaleType。使用 RemoteViews,我们无法获取 ImageView...
我尝试过:

myRemoteViews.setString(R.id.myImage, "setScaleType", "CENTER");


日志文件说:函数 setScaleType 对于 ImageView 不可用。
有人知道如何在 AppWidget 中进行这种定义吗?
3个回答

82

您可以使用此段代码在程序中设置ImageView的比例类型。

 imgview.setScaleType(ImageView.ScaleType.CENTER_INSIDE);

希望这能有所帮助...


16
这是设置普通“ImageView”比例类型的方法,但问者询问的是在“RemoteViews”中的设置。 - Dan Hulme

9

如果查看ImageView的源代码,您会发现setScaleType方法缺少@android.view.RemotableViewMethod注释,因此无法通过RemoteViews接口调用它。

这个限制有一种变通方法,但不是很完美:为每个所需的ScaleType定义不同的布局XML,并在创建RemoteViews之前选择它们。如果您的布局比较复杂或者要对多个视图应用此变通方法,则可以使用RemoteViews.addView将特定的ImageView布局添加到主布局中。

我正在我的应用程序Showr中为appwidgets使用这个变通方法(使用addView)。这种方法的问题是,股票启动器存在一个错误:如果通过创建新的RemoteViews并调用addView来添加不同的ImageView布局以更改现有appwidget的比例类型,则它并不总是意识到布局已经发生了变化。


不确定这是否可行,但是可以扩展ImageView并添加注释,然后您的自定义ImageView将调用super.setScaleType(...) - pjco
2
你不能在RemoteViews中使用自己的类,只能使用系统内置的类。 - Dan Hulme

1

由于没有简单的方法在移除视图上调用 setScaleType,我想出的解决办法是在我的布局中创建三个imageView,然后通过更改未被用户选定比例类型的imageView的可见性来实现:

    // first I declared a map to associate preference values with imageView ids

    private static final HashMap<Integer,Integer> widgetImageViewIds;

    static {
        widgetImageViewIds = new HashMap<Integer, Integer>();
        widgetImageViewIds.put(MyAppPreferences.PREF_ALIGN_START, R.id.imageViewStart);
        widgetImageViewIds.put(MyAppPreferences.PREF_ALIGN_CENTER, R.id.imageViewCenter);
        widgetImageViewIds.put(MyAppPreferences.PREF_ALIGN_END, R.id.imageViewEnd);
    }

    ...

    // then when I update my widget show/hide the widgets based on the preference

    for (HashMap.Entry<Integer, Integer> entry : widgetImageViewIds.entrySet()) {
        Integer imageViewAlignment = entry.getKey();
        Integer imageViewId = entry.getValue();
        views.setViewVisibility(imageViewId, imageViewAlignment.intValue() != imageAlignmentPreferenceValue ? View.GONE : View.VISIBLE);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接