我正在尝试创建一个主屏幕小部件,这是一种显示时间的自定义方式(想象一下弧形时钟但不同)。所以,我需要能够使用Android图形库绘制到这个小部件。实际上我只需每20或30分钟更新一次。
这是最好的方法吗?似乎对小部件的视图类型有很多限制。我可以只包含一个我用信息更新的画布,它会重绘吗?或者我是否需要将它作为ImageView,并让BroadCast Receiver每20分钟重绘一个图像然后替换图像?
TL; DR 我可以在主屏幕小部件中包含画布对象,我每20分钟重绘一次吗?
我很难弄清楚如何用短语来搜索答案,所以任何正确方向的帮助都会受到赞赏。
答案 0 :(得分:2)
使用RemoteViews系统的Android主屏幕小部件。
这意味着您的应用提供了其布局的ID,以及对此布局的一些基本(有限)修改集,例如设置文本,颜色,可见性等。所有这些修改都写入“Parcel”并由系统发送到实际管理主屏幕项目的其他进程。此过程将加载布局,取消修改数据并适用于布局。
所以你看,你不能直接访问Canvas。
编辑:绘制任何内容的一种可能性是使用RemoteViews.setBitmap,因此您在窗口小部件中有任何位图。但请注意,Android人员说它是SLOW,因为位图必须是stored to "parcel",这意味着转换为类似字符串的东西,然后转换回其他部分的Bitmap。如果它是小图像,它可能会工作。
答案 1 :(得分:2)
在widget_layout.xml
中有一个ImageView
,其中包含您的绘图区域
<ImageView
android:id="@+id/widget_image"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
在您的AppWidgetProvider.onUpdate
方法中,创建一个位图,然后从中绘制一个Canvas
。位图越大,质量越高,性能就越差。
Bitmap bitmap = Bitmap.createBitmap(400, 180, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bitmap);
在画布上完成绘画后,使用setImageViewBitmap
final RemoteViews remoteViews = new RemoteViews(
context.getPackageName(), R.layout.widget_layout);
remoteViews.setImageViewBitmap(R.id.widget_image, bitmap);