Android RemoteView,如何在小部件内设置ImageView的ScaleType?
我正在开发一个窗口小部件,右边有一个图像,用户可以在设置屏幕中选择。 然后,用户可以使用ImageView.setScaleType(“中心”)设置图像。这很有效。 然后,图像的URL作为URL存储在首选项中,也作为位图的Base64编码字符串存储(因为我想收缩图像,用户可以在设置中旋转图像) 在小部件中,我加载图像。那很好。使用URI和位图。 ImageView的ScaleType在布局中也设置为固定值,同样有效 但是如何以编程方式在小部件中定义ImageView的ScaleType? 因为我想将ScaleType设置为值,用户已经在设置中选择了。使用RemoteView,我们无法获取ImageView… 我试过:Android RemoteView,如何在小部件内设置ImageView的ScaleType?,android,widget,imageview,Android,Widget,Imageview,我正在开发一个窗口小部件,右边有一个图像,用户可以在设置屏幕中选择。 然后,用户可以使用ImageView.setScaleType(“中心”)设置图像。这很有效。 然后,图像的URL作为URL存储在首选项中,也作为位图的Base64编码字符串存储(因为我想收缩图像,用户可以在设置中旋转图像) 在小部件中,我加载图像。那很好。使用URI和位图。 ImageView的ScaleType在布局中也设置为固定值,同样有效 但是如何以编程方式在小部件中定义ImageView的ScaleType? 因为我
设置字符串(R.id.myImage,“setScaleType”,“CENTER”)
日志文件显示:函数setScaleType不适用于ImageView
是否有人知道如何在AppWidget中定义此项?您可以使用此段以编程方式设置图像视图的缩放类型
imgview.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
希望对您有所帮助……如果您查看
ImageView
的源代码,您可以看到setScaleType
方法缺少@android.view.RemotableViewMethod
注释,因此无法通过remoteview
接口调用它
对于这个限制,有一个解决方法,但它并不完美:为每个您想要的ScaleType定义一个不同的布局XML,并在创建RemoteView
之前在它们之间进行选择。如果您的布局很复杂,或者您有多个视图要应用此解决方案,则可能需要使用将特定的ImageView
布局添加到主布局中
我正在为我的应用程序中的AppWidget使用此变通方法(使用
addView
)。此方法的问题是stock launcher有一个bug:如果通过创建新的RemoteView
并调用addView
向现有appwidget添加不同的ImageView
布局来更改appwidget的缩放类型,它并不总是意识到布局已经改变。因为在移除视图上调用setScaleType
不是一种简单的方法,我提出的解决方法是在布局中创建三个图像视图,然后更改没有用户选择的缩放类型的视图的可见性:
// 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);
}
//首先,我声明了一个映射,将首选项值与imageView ID关联起来
私有静态最终HashMap WidgetImageViewId;
静止的{
widgetImageViewIds=新HashMap();
widgetImageViewIds.put(MyAppPreferences.PREF_ALIGN_START,R.id.imageViewStart);
widgetmageviewids.put(MyAppPreferences.PREF_ALIGN_CENTER,R.id.imageViewCenter);
WidgetImageViewId.put(MyAppPreferences.PREF_ALIGN_END,R.id.imageViewEnd);
}
...
//然后,当我更新我的小部件时,根据偏好显示/隐藏小部件
对于(HashMap.Entry:widgetImageViewIds.entrySet()){
整数imageViewAlignment=entry.getKey();
整数imageViewId=entry.getValue();
views.setViewVisibility(imageViewId,imageViewAlignment.intValue()!=imageAlignmentPreferenceValue?View.GONE:View.VISIBLE);
}
这是如何为普通的图像视图设置缩放类型,但提问者在远程视图中询问。不确定这是否可行,但是扩展图像视图
并添加注释如何,然后自定义图像视图
将调用super.setcaletype(…)
您不能在远程视图中使用自己的类,只能使用系统内置的类。