German Problem mit Widgets

inside1

Member
Licensed User
Longtime User
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!


lvGgOueyuzQ8ImwIoFu6D0nimHDrpdOczqTQqqSXrugUCzTFVU0OAzYD5IowJVmKug=h230


MfG,
Vincenz
 

corwin42

Expert
Licensed User
Longtime User
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
@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:

B4X:
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:

B4X:
inconvertible types
_c.Initialize((android.view.View)(_bm.getObject()));

Was mache ich noch Falsch? Hab ich dieses SetImage falsch verwendet?
 
Last edited:

corwin42

Expert
Licensed User
Longtime User
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
    7.6 KB · Views: 202

inside1

Member
Licensed User
Longtime User
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
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.
 

Enrico79

Member
Licensed User
Longtime User
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. :eek:

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.
 
Last edited:

corwin42

Expert
Licensed User
Longtime User
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
 
Top