inside1 Member Licensed User Longtime User Jan 30, 2013 #1 Hallo! Ich habe eine LED-Uhr programmiert und möchte diese jetzt noch zusätzlich als Widget umsetzen, aber ich komme einfach nicht weiter. Ich habe schon das Forum und die Tutorials durchgeschaut und habe keine Lösung gefunden. Mein English ist leider auch nicht so gut um alles zu verstehen. Ich benutze ein Canvas um die Uhr zu zeichnen. So wie ich gelesen hab, sind aber nur ImageViews in Widgets möglich. Kann ich irgendwie in ImageViews zeichnen oder ein Canvas auf ein ImageView anwenden oder rein kopieren? Ich hoffe, daß mir jemand helfen kann. Danke im Voraus! MfG, Vincenz
Hallo! Ich habe eine LED-Uhr programmiert und möchte diese jetzt noch zusätzlich als Widget umsetzen, aber ich komme einfach nicht weiter. Ich habe schon das Forum und die Tutorials durchgeschaut und habe keine Lösung gefunden. Mein English ist leider auch nicht so gut um alles zu verstehen. Ich benutze ein Canvas um die Uhr zu zeichnen. So wie ich gelesen hab, sind aber nur ImageViews in Widgets möglich. Kann ich irgendwie in ImageViews zeichnen oder ein Canvas auf ein ImageView anwenden oder rein kopieren? Ich hoffe, daß mir jemand helfen kann. Danke im Voraus! MfG, Vincenz
klaus Expert Licensed User Longtime User Jan 30, 2013 #2 Du kannst einen Canvas mit einer ImageView verwenden. Code: Canvas1.Initialize(ImageView1) Ich weiss aber nicht ob das in einem Widget funktioniert. Beste Grüsse.
Du kannst einen Canvas mit einer ImageView verwenden. Code: Canvas1.Initialize(ImageView1) Ich weiss aber nicht ob das in einem Widget funktioniert. Beste Grüsse.
corwin42 Expert Licensed User Longtime User Feb 1, 2013 #3 Nein, für ein Widget geht das nicht. Du musst eine Bitmap erstellen mit Dim bm as Bitmap bm.InitializeMutable(x,y) und mit dieser Bitmap einen Canvas initialisieren. cv.Initialize(bm) Dann kannst Du darauf rummalen und später über das RemoteViews Objekt die Bitmap an das ImageView im Widget schicken. Aber Achtung: Das funktioniert zuverlässig nur mit recht kleinen Bitmaps, da für die Kommunikation mit dem Widget die Daten serialisiert werden und der zur Verfügung stehende Buffer dafür ist sehr klein. Ich hatte teilweise schon Probleme mit 256x256 Pixel Bitmaps. Über einen Trick könnte man die Bitmap in einer Datei speichern und dann dem Widget mitteilen, dass es das Bild aus der Datei holen soll. Das ist aber etwas kompliziert und geht ohne Reflection library bzw. eine Custom Library gar nicht.
Nein, für ein Widget geht das nicht. Du musst eine Bitmap erstellen mit Dim bm as Bitmap bm.InitializeMutable(x,y) und mit dieser Bitmap einen Canvas initialisieren. cv.Initialize(bm) Dann kannst Du darauf rummalen und später über das RemoteViews Objekt die Bitmap an das ImageView im Widget schicken. Aber Achtung: Das funktioniert zuverlässig nur mit recht kleinen Bitmaps, da für die Kommunikation mit dem Widget die Daten serialisiert werden und der zur Verfügung stehende Buffer dafür ist sehr klein. Ich hatte teilweise schon Probleme mit 256x256 Pixel Bitmaps. Über einen Trick könnte man die Bitmap in einer Datei speichern und dann dem Widget mitteilen, dass es das Bild aus der Datei holen soll. Das ist aber etwas kompliziert und geht ohne Reflection library bzw. eine Custom Library gar nicht.
inside1 Member Licensed User Longtime User Feb 4, 2013 #4 @corwin42: Danke! Hab ich auch schon gemerkt, daß es so nicht geht. Das ist irgendwie alles so umständlich. Hab das jetzt mal mit dem Widget-Tutorial "HomeWidgets" ausprobiert. Unter Process_Globals habe ich "Dim bm as Bitmap" definiert. Und hab ich noch versucht etwas ins Bitmap zu Zeichnen und ans ImageView1 zu übergeben: Code: Sub rv_RequestUpdate Dim C As Canvas C.Initialize(bm) C.DrawCircle(10,10,20,Colors.RGB(0,255,0),True,1) rv.SetImage("ImageView1", bm) rv.UpdateWidget End Sub Da erhalte ich dann aber ein Java-Fehler: Code: inconvertible types _c.Initialize((android.view.View)(_bm.getObject())); Was mache ich noch Falsch? Hab ich dieses SetImage falsch verwendet? Last edited: Feb 4, 2013
@corwin42: Danke! Hab ich auch schon gemerkt, daß es so nicht geht. Das ist irgendwie alles so umständlich. Hab das jetzt mal mit dem Widget-Tutorial "HomeWidgets" ausprobiert. Unter Process_Globals habe ich "Dim bm as Bitmap" definiert. Und hab ich noch versucht etwas ins Bitmap zu Zeichnen und ans ImageView1 zu übergeben: Code: Sub rv_RequestUpdate Dim C As Canvas C.Initialize(bm) C.DrawCircle(10,10,20,Colors.RGB(0,255,0),True,1) rv.SetImage("ImageView1", bm) rv.UpdateWidget End Sub Da erhalte ich dann aber ein Java-Fehler: Code: inconvertible types _c.Initialize((android.view.View)(_bm.getObject())); Was mache ich noch Falsch? Hab ich dieses SetImage falsch verwendet?
corwin42 Expert Licensed User Longtime User Feb 5, 2013 #5 Eigentlich schon fast richtig. Deine Bitmap-Initialisierung fehlt noch und Du musst den Canvas mit C.Initialize2(bm) intialisieren. Ich habe mal ein Minimalbeispiel angehängt. Attachments WidgetBitmap.zip WidgetBitmap.zip 7.6 KB · Views: 618
Eigentlich schon fast richtig. Deine Bitmap-Initialisierung fehlt noch und Du musst den Canvas mit C.Initialize2(bm) intialisieren. Ich habe mal ein Minimalbeispiel angehängt.
inside1 Member Licensed User Longtime User Feb 6, 2013 #6 Super! Habs hinbekommen. Vielen Dank für das Beispiel!
inside1 Member Licensed User Longtime User Feb 9, 2013 #7 Hab noch eine kleine Frage: Kann man irgendwie die wahre Größe des Widgets ermitteln? Bei manchen Launchern kann man ja die Raster-Größe ändern sowie auch die Widgets Skalieren. Ich nutze z.B. den Nova Launcher und hab da ein engeres Raster gewählt als üblich. Es wäre schön, wenn ich nun die Größe ermitteln könnte um das Widget Panel in der größe anpassen zu können. Bei manche Widgets (z.B. "HD Widgets") skaliert automatisch der Inhalt, wenn man sie in der Größe ändert. Genau das würde ich auch gern können.
Hab noch eine kleine Frage: Kann man irgendwie die wahre Größe des Widgets ermitteln? Bei manchen Launchern kann man ja die Raster-Größe ändern sowie auch die Widgets Skalieren. Ich nutze z.B. den Nova Launcher und hab da ein engeres Raster gewählt als üblich. Es wäre schön, wenn ich nun die Größe ermitteln könnte um das Widget Panel in der größe anpassen zu können. Bei manche Widgets (z.B. "HD Widgets") skaliert automatisch der Inhalt, wenn man sie in der Größe ändert. Genau das würde ich auch gern können.
corwin42 Expert Licensed User Longtime User Feb 10, 2013 #8 Nein, das geht leider nicht. Es wäre auch nicht möglich, die Größe des Panels zur Laufzeit zu ändern. Einzige Möglichkeit: B4A generiert aus dem Design eine XML-Layout-Datei (unter Objects/res/layout). Leider ist dieses Layout sehr statisch (AbsoluteLayout wird benutzt). Du kannst dieses XML-File modifizieren und daraus ein besser skalierbares layout machen. Das erfordert natürlich einige Kenntnisse über die Android XML Layout Möglichkeiten. Das ist etwas mehr Arbeit und man muss sich in die Android Layouts einarbeiten. Ich habe das aber z.B. für meine WetterApp gemacht.
Nein, das geht leider nicht. Es wäre auch nicht möglich, die Größe des Panels zur Laufzeit zu ändern. Einzige Möglichkeit: B4A generiert aus dem Design eine XML-Layout-Datei (unter Objects/res/layout). Leider ist dieses Layout sehr statisch (AbsoluteLayout wird benutzt). Du kannst dieses XML-File modifizieren und daraus ein besser skalierbares layout machen. Das erfordert natürlich einige Kenntnisse über die Android XML Layout Möglichkeiten. Das ist etwas mehr Arbeit und man muss sich in die Android Layouts einarbeiten. Ich habe das aber z.B. für meine WetterApp gemacht.
E Enrico79 Member Licensed User Longtime User Feb 15, 2013 #9 Skaliebares Layout für Widget Hi, das mit dem skalierbaren Layout in der Config xml bei widgets würde mich mal interessieren. Kennst du ein paar leicht verständliche quellen? Ich würde das gern mal testen. corwin42 said: Nein, das geht leider nicht. Es wäre auch nicht möglich, die Größe des Panels zur Laufzeit zu ändern. Einzige Möglichkeit: B4A generiert aus dem Design eine XML-Layout-Datei (unter Objects/res/layout). Leider ist dieses Layout sehr statisch (AbsoluteLayout wird benutzt). Du kannst dieses XML-File modifizieren und daraus ein besser skalierbares layout machen. Das erfordert natürlich einige Kenntnisse über die Android XML Layout Möglichkeiten. Das ist etwas mehr Arbeit und man muss sich in die Android Layouts einarbeiten. Ich habe das aber z.B. für meine WetterApp gemacht. Click to expand... Last edited: Feb 15, 2013
Skaliebares Layout für Widget Hi, das mit dem skalierbaren Layout in der Config xml bei widgets würde mich mal interessieren. Kennst du ein paar leicht verständliche quellen? Ich würde das gern mal testen. corwin42 said: Nein, das geht leider nicht. Es wäre auch nicht möglich, die Größe des Panels zur Laufzeit zu ändern. Einzige Möglichkeit: B4A generiert aus dem Design eine XML-Layout-Datei (unter Objects/res/layout). Leider ist dieses Layout sehr statisch (AbsoluteLayout wird benutzt). Du kannst dieses XML-File modifizieren und daraus ein besser skalierbares layout machen. Das erfordert natürlich einige Kenntnisse über die Android XML Layout Möglichkeiten. Das ist etwas mehr Arbeit und man muss sich in die Android Layouts einarbeiten. Ich habe das aber z.B. für meine WetterApp gemacht. Click to expand...
corwin42 Expert Licensed User Longtime User Feb 16, 2013 #10 Ein Beispiel habe ich gerade nicht. Ich arbeite aber gerade an einem WorldClock widget, was so ziemlich alles an "Schweinereien" enthält, was mit Widgets mit B4A so möglich ist. Das werde ich mit Source veröffentlichen. sent from my Galaxy Nexus
Ein Beispiel habe ich gerade nicht. Ich arbeite aber gerade an einem WorldClock widget, was so ziemlich alles an "Schweinereien" enthält, was mit Widgets mit B4A so möglich ist. Das werde ich mit Source veröffentlichen. sent from my Galaxy Nexus