15

对于我的第一个也是最棒的 Android 项目,我想创建一个主屏幕小部件,它显示了这些天所有孩子都在谈论的弧形时钟之一。

基于RemoteViews的限制,在我看来,在屏幕上实际绘制它的适当方法是在实际布局中使用ImageView,然后在更新时创建一个或两个ShapeDrawable并将它们绘制到新的创建位图。然后,将该位图设置为 ImageView 的源。

不过,关于这个过程有一些东西我只是不明白。以下是我尝试用于更新小部件的代码。我根本没有在屏幕上绘制任何内容。ImageView 有一个由其src属性设置的占位符图像。当我不运行代码将其更新为我的绘图时,占位符图像保持在原位。所以,我知道这段代码正在做某事,但显然不是正确的。

RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
Bitmap bitmap = Bitmap.createBitmap(100, 100, Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);

ShapeDrawable drawable = new ShapeDrawable(new ArcShape(0, 360));
drawable.getPaint().setColor(0xffff0000);
drawable.getPaint().setStrokeWidth(5.0f);
drawable.setIntrinsicWidth(100);
drawable.setIntrinsicHeight(100);
drawable.draw(canvas);

views.setImageViewBitmap(R.id.ImageView01, bitmap);     
appWidgetManager.updateAppWidget(appWidgetId, views);

我知道这不可能那么容易。那么,我是否朝着正确的方向前进?


更新

好吧,也许信息太多了。我真正想问的问题是:

如果我想在小部件上绘制形状,我应该使用 ImageView 并从我的 ShapeDrawable 创建位图,还是有更合适的方法来绘制到受 RemoteViews 约束的小部件中?

4

3 回答 3

8

SDK 中实际上有一个小部件AnalogClock,它与您尝试做的非常相似。

它被实现为一个扩展View并用 注释的类@RemoteView。它在上面注册接收器,Intent.ACTION_TIME_TICKIntent.ACTION_TIME_CHANGED通过覆盖该onDraw方法来绘制自己。查看源代码。标准AlarmClock应用程序将此视图公开 为可以添加到主屏幕的小部件。

我认为这是一种很好的(如果不是最好的)方式来实现你所描述的并且显然效果很好。

于 2010-02-08T20:28:26.130 回答
5

这很好用:

Paint p = new Paint(); 
p.setAntiAlias(true);
p.setStyle(Style.STROKE);
p.setStrokeWidth(8);
p.setColor(0xFFFF0000);

Bitmap bitmap = Bitmap.createBitmap(100, 100, Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
canvas.drawArc(new RectF(10, 10, 90, 90), 0, 270, false, p);

RemoteViews views = new RemoteViews(updateService.getPackageName(), R.layout.main);
views.setImageViewBitmap(R.id.canvas, bitmap);

ComponentName componentName = new ComponentName(updateService, DashboardAppWidgetProvider.class);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(updateService);
appWidgetManager.updateAppWidget(componentName, views);

我猜您原始代码的问题只是绘制弧线的方式 - 这就是为什么没有出现的原因。

顺便说一句:您可以通过搜索“弧形时钟”在市场上找到一个内存占用非常小的可定制“弧形时钟”!

于 2010-08-05T13:49:28.860 回答
0

要创建自定义组件,我将扩展 View 或 View 的任何子类并覆盖 onDraw(Canvas canvas) 方法来进行绘图。在画布对象上可以调用drawLine()、drawArc()、drawPicture()、drawPoints()、drawText()、drawRect()等方法......

这里有更多细节。

这是画布的api。

我相信您可以随后将自定义视图添加到远程视图以制作小部件。

于 2010-02-06T20:50:45.573 回答