What's the proper way to implement an Android widget with dynamically drawn content?
There is actually a widget called AnalogClock
in the SDK that is very similar to what you are trying to do.
It is implemented as a class that extends View
and is annotated with @RemoteView
. It registers receivers on Intent.ACTION_TIME_TICK
and Intent.ACTION_TIME_CHANGED
and draws itself by overriding the onDraw
method. Check out the source. The standard AlarmClock application exposes this view as a widget that can be added to the home screen.
I think that is a good (if not the best) way to implement what you described and obviously works well.
This works great:
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);
I guess the problem with your original code was just the way of drawing the arc - that's why nothing showed up.
BTW: You can find a customizable "Arc Clock" with a very small memory footprint in the Market by searching for "arc clock"!