在画布上绘制到主屏幕小部件 - Android

时间:2012-02-23 09:41:09

标签: android widget android-canvas

我正在尝试创建一个主屏幕小部件,这是一种显示时间的自定义方式(想象一下弧形时钟但不同)。所以,我需要能够使用Android图形库绘制到这个小部件。实际上我只需每20或30分钟更新一次。

这是最好的方法吗?似乎对小部件的视图类型有很多限制。我可以只包含一个我用信息更新的画布,它会重绘吗?或者我是否需要将它作为ImageView,并让BroadCast Receiver每20分钟重绘一个图像然后替换图像?

TL; DR 我可以在主屏幕小部件中包含画布对象,我每20分钟重绘一次吗?

我很难弄清楚如何用短语来搜索答案,所以任何正确方向的帮助都会受到赞赏。

2 个答案:

答案 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);