在画布上绘制主屏幕小工具-Android



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

做这件事最好的方法是什么?小部件的视图类型似乎有很多限制。我可以只包括一个画布吗?我用信息更新了它,它会重新绘制吗?或者我可能需要它是一个ImageView,让BroadCast接收器每20分钟重新绘制一张图像,然后替换图像?

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

我很难想出如何用短语表达这个问题来寻找答案,所以如果能在正确的方向上提供任何帮助,我将不胜感激。

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

使用RemoteViews系统的Android主屏幕小部件。

这意味着你的应用程序提供了其布局的id,以及对该布局的一些基本(有限)修改,如设置文本、颜色、可见性等。所有这些修改都被写入"Parcel",并由系统发送到实际管理主屏幕项目的其他进程。此过程将加载布局,取消对布局的执行修改数据和应用程序。

所以你看,你不能直接访问Canvas。

EDIT:绘制任何内容的一种可能性是使用RemoteViews.setBitmap,这样您就可以在小部件中拥有任何位图。但要注意,安卓系统的人说它很慢,因为位图必须存储到"包裹"中,这意味着转换成字符串之类的东西,然后在其他部分转换回位图。如果是小图像,它可能会工作。

最新更新