【问题标题】:Android RemoteViews, how to set ScaleType of an ImageView inside a widget?Android RemoteViews,如何在小部件内设置 ImageView 的 ScaleType?
【发布时间】:2011-10-25 20:01:05
【问题描述】:

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

在小部件中,我加载图像。这很好用。使用 URI 和位图。 ImageView 的 ScaleType 在 Layout 中也设置为固定值,也可以。

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

我试过了:


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


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

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

【问题讨论】:

    标签: android widget imageview


    【解决方案1】:

    您可以使用此段以编程方式设置图像视图的比例类型..

     imgview.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
    

    希望对你有帮助...

    【讨论】:

    • 这是如何为普通ImageView设置比例类型,但提问者在RemoteViews中询问。
    【解决方案2】:

    查看ImageView的源码可以看到setScaleType方法缺少@android.view.RemotableViewMethod注解,所以无法通过RemoteViews接口调用。

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

    我正在为我的应用程序Showr 中的应用程序小部件使用此解决方法(使用addView)。这种方法的问题是股票启动器有一个错误:如果您通过创建新的RemoteViews 并调用addView 添加不同的ImageView更改现有应用程序小部件的缩放类型布局,它并不总是意识到布局已经改变。

    【讨论】:

    • 不确定这是否可行,但是如何扩展ImageView 并添加注释,然后您的自定义ImageView 将调用super.setScaleType(...)
    • 您不能在RemoteViews 中使用自己的类,只能使用系统内置的类。
    【解决方案3】:

    由于在删除视图上调用 setScaleType 并不是一种简单的方法,因此我想出的工作是在我的布局中创建三个 imageViews,然后更改那些没有选择比例类型的图像视图的可见性用户:

        // 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);
        }
    

    【讨论】:

      猜你喜欢
      • 2015-06-29
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-03
      相关资源
      最近更新 更多