Was ist der richtige Weg, um ein Android-Widget mit dynamisch gezeichneten Inhalt zu implementieren?

Für meine erste und am meisten awesomest Android-Projekt, möchte ich ein Home-Screen-Widget, die eine dieser Arc-Uhren , die alle Kinder sind schwärmen über diese Tage.

Basierend auf den Einschränkungen von RemoteViews , sieht es mir aus, dass der passende Weg, um es tatsächlich auf dem Bildschirm gezeichnet wird, ist ein ImageView in der tatsächlichen Layout verwenden, dann, wenn es aktualisiert wird, erstellen Sie eine ShapeDrawable oder zwei und ziehen sie auf eine neue Erstellt Bitmap . Setzen Sie dann Bitmap als Quelle der ImageView.

  • Wie konvertiere ich Android View in PDF
  • Gibt es eine Möglichkeit, ein EditText / Eingabefeld in ein Homescreen-Widget zu setzen?
  • Firebase Push Notification - Wie zeigt man eine Multiline-Nachricht in der Benachrichtigung an
  • Java.io.IOException: SERVICE_NOT_AVAILABLE im GCM-Client
  • Facebook-Integration in Android-Anwendung
  • Android Studio 0.2.9 und Neues Projekt
  • Es gibt etwas über diesen Prozess, dass ich nur nicht grokking, though. Das folgende ist der Code, den ich versucht habe, das Widget zu aktualisieren. Ich habe überhaupt nichts auf den Bildschirm gezeichnet. Das ImageView hat ein Platzhalterbild, das gerade von seiner Eigenschaft src . Wenn ich den Code nicht laufe, um ihn auf meine Zeichnung zu aktualisieren, bleibt das Platzhalterbild an Ort und Stelle. Also, ich weiß, dieser Code tut etwas , nur offensichtlich nicht das Richtige.

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

    Ich wusste, dass es nicht so einfach sein könnte. Also gehe ich sogar in die richtige Richtung?


    Aktualisieren

    Ok, vielleicht war das zu viel Information. Die Frage, die ich wirklich fragen möchte, ist:

    Wenn ich Formen auf ein Widget zeichnen möchte, sollte ich ein ImageView verwenden und eine Bitmap aus meinem ShapeDrawable erstellen oder gibt es eine passendere Möglichkeit, in ein Widget zu zeichnen, wo es von RemoteViews eingeschränkt wird?

  • Andengine niedrige FPS auf bestimmten Handys
  • Wie konstruiere man benutzerdefinierte Ansichten in xamarin
  • Können wir INSTALL_REFERRER zweimal in einer Android-App haben?
  • ExoPlayer - spiele 10 Dateien nacheinander
  • Wie lizenziere ich meine Android-Anwendung?
  • Wie lautet der Lesermodus in Firefox ausgelöst?
  • 3 Solutions collect form web for “Was ist der richtige Weg, um ein Android-Widget mit dynamisch gezeichneten Inhalt zu implementieren?”

    Es gibt eigentlich ein Widget namens AnalogClock im SDK, das sehr ähnlich ist, was du versuchst zu tun.

    Es ist als Klasse implementiert, die die View und mit @RemoteView kommentiert @RemoteView . Es registriert Empfänger auf Intent.ACTION_TIME_TICK und Intent.ACTION_TIME_CHANGED und zeichnet sich durch Überschreiben der onDraw Methode. Schauen Sie sich die Quelle an . Die Standard- AlarmClock- Anwendung macht diese Ansicht als Widget, das dem Startbildschirm hinzugefügt werden kann.

    Ich denke, das ist eine gute (wenn nicht die beste) Weg, um zu implementieren, was Sie beschrieben haben und offensichtlich gut funktioniert.

    Das funktioniert super:

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

    Ich denke, das Problem mit Ihrem ursprünglichen Code war nur die Art und Weise der Zeichnung der Bogen – das ist, warum nichts auftauchte.

    BTW: Sie finden eine kundengerechte "Arc Clock" mit einem sehr kleinen Speicherplatz im Markt, indem Sie nach "arc clock" suchen!

    Um eine benutzerdefinierte Komponente zu erstellen, würde ich die Ansicht oder eine beliebige Unterklasse von View erweitern und die onDraw (Canvas Canvas) -Methode überschreiben, um deine Zeichnung zu machen. Auf dem Canvas-Objekt kannst du Methoden wie drawLine (), drawArc (), drawPicture (), drawPoints (), drawText (), drawRect (), etc …..

    Hier ist mehr Details.

    Hier ist die Api für Leinwand.

    Ich glaube, Sie können dann Ihre benutzerdefinierte Ansicht zu einer Remote-Ansicht für den Zweck, ein Widget zu machen.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.