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

时间:2011-10-25 20:01:06

标签: android widget imageview

我正在开发一个带有图像的小部件,可以在其中一个设置屏幕中由用户选择。 然后可以使用ImageView.setScaleType(“CENTER”)从用户设置图像。这样可行。 然后,图像的URL作为URL存储在首选项中,也作为Bitmap的Base64编码字符串存储(因为我想缩小图像,用户可以在设置中旋转它)

在小部件中,我加载图像。这很好。使用URI和Bitmap也是如此。 ImageView的ScaleType也设置为布局中的固定值,也适用。

但是如何以编程方式在窗口小部件中定义ImageView的ScaleType? 原因我想将ScaleType设置为值,用户已在设置中选择。使用RemoteViews,我们无法获得ImageView ...

我试过了:


  

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


日志文件说:ImageView无法使用函数setScaleType。

有人知道如何在AppWidget中进行此定义吗?

3 个答案:

答案 0 :(得分:52)

您可以使用此段以编程方式为Imageview设置缩放类型..

 imgview.setScaleType(ImageView.ScaleType.CENTER_INSIDE);

希望它有所帮助...

答案 1 :(得分:9)

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

这个限制有一个解决方法,但它并不漂亮:为您想要的每个ScaleType定义不同的布局XML,并在创建RemoteViews之前选择它们。如果您的布局很复杂,或者您有多个视图要应用此解决方法,则可能需要使用RemoteViews.addView在主布局中添加特定的ImageView布局。

我在我的应用Showr中使用此解决方法(addView)用于appwidgets。此方法存在的问题是,库存启动器存在错误:如果您通过创建新的RemoteViews并调用addView来添加更改现有appwidget的比例类型不同的ImageView布局,它并不总是意识到布局已经改变。

答案 2 :(得分:1)

由于在删除视图上调用setScaleType并不是一种简单的方法,因此我想出的工作是在我的布局中制作三个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);
    }