Как правильно реализовать виджет Android с динамически отображаемым содержимым? - PullRequest
13 голосов
/ 02 февраля 2010

Для моего первого и самого удивительного проекта Android я хочу создать виджет домашнего экрана, который отображает один из тех Arc Clocks , которыми все дети в восторге в эти дни.

Исходя из ограничений RemoteViews , мне кажется, что соответствующий способ фактически нарисовать его на экране - это использовать ImageView в реальном макете, а затем, когда это обновление, создайте ShapeDrawable или два и нарисуйте их на только что созданном Bitmap . Затем установите это растровое изображение в качестве источника 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?

Ответы [ 3 ]

8 голосов
/ 08 февраля 2010

На самом деле в SDK есть виджет с именем AnalogClock, который очень похож на то, что вы пытаетесь сделать.

Он реализован как класс, расширяющий Viewи помечается @RemoteView.Он регистрирует приемники на Intent.ACTION_TIME_TICK и Intent.ACTION_TIME_CHANGED и отрисовывает себя, переопределяя метод onDraw.Проверьте источник .Стандартное AlarmClock приложение предоставляет это представление как виджет, который можно добавить на домашний экран.

Iдумаю, что это хороший (если не лучший) способ реализовать то, что вы описали, и, очевидно, хорошо работает.

5 голосов
/ 05 августа 2010

Это прекрасно работает:

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

Полагаю, проблема с вашим исходным кодом заключалась лишь в способе рисования дуги - вот почему ничего не появилось.

Кстати: вы можете найти настраиваемые "Часы дуги" с очень маленьким объемом памяти в Маркете, выполнив поиск по слову "Часы дуги"!

0 голосов
/ 06 февраля 2010

Чтобы создать пользовательский компонент, я бы расширил View или любой подкласс View и переопределил метод onDraw (Canvas canvas), чтобы сделать ваш рисунок. На объекте canvas можно вызывать такие методы, как drawLine (), drawArc (), drawPicture (), drawPoints (), drawText (), drawRect () и т. Д. *

Вот более подробная информация.

Вот API для Canvas.

Полагаю, вы можете добавить свой собственный вид в удаленный вид для создания виджета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...