German Hilfe meine Imageview dreht sich nicht

flightnet

Member
Licensed User
Longtime User
Guete Obig allerseits

Ich habe ein kleines Probelm und zwar dreht sich die Bitmap in meinem Kompass nicht.
Ich will erreichen, dass sich das bild dgzahlen.png immer nach der akktuellen himmelsrichtung ausrichtet.
Diese variable ist das heading und ist als globale variable oben deklariert.
Aber sobald ich es lade kommt ein Java fehler: java.lang.NullPointerException
Kann mir jemand sagen was ich falsch mache?
Die anderen Beiträge hab ich mir schon durchgeschaut aber nicht herausgefunden was ich falsch mache.
lg schöne abig

B4X:
Sub directionalgyro_turn

    IVdg1.Visible = True
    IVdg2.visible = True
    IVdg3.Visible = True
    lblheading.Visible = True
    lblheading.Text = heading & " °"
    lblheading.TextColor = Colors.ARGB (255,36,85,255)

    IVdg1.Bitmap = LoadBitmap(File.DirAssets, "dgca1.png")
    IVdg2.Bitmap = LoadBitmap(File.DirAssets, "dgzahlen.png")
    IVdg3.Bitmap = LoadBitmap(File.DirAssets, "dgplane.png")
   
    Dim csvDg As Canvas
    Dim bmpDg As Bitmap
    Dim rectDg As Rect
   
    bmpDg.Initialize (File.DirAssets , "dgzahlen.png")
   
    IVdg2.Initialize ("")
    IVdg2.Color = Colors.Transparent

    csvDg.Initialize (IVdg2)
    rectDg.Initialize (0,0,bmpDg.Width ,bmpDg.Height)
   
    csvDg.DrawBitmapRotated (bmpDg,rectDg,rectDg,heading)
    IVdg2.Invalidate2 (rectDg)
   
   

End Sub
 

klaus

Expert
Licensed User
Longtime User
Leider zeigst Du uns zu wenig Code.
Wie oft wird Sub directionalgyro_turn aufgerufen ?
Da sie scheinbar mehrmals aufgerufen wird musst Du einige Zeilen verschieben:
Dim csvDg As Canvas
Dim bmpDg As Bitmap
Dim rectDg As Rect

nach Sub Globals

IVdg1.Bitmap = LoadBitmap(File.DirAssets, "dgca1.png")
IVdg2.Bitmap = LoadBitmap(File.DirAssets, "dgzahlen.png")
IVdg3.Bitmap = LoadBitmap(File.DirAssets, "dgplane.png")
bmpDg.Initialize (File.DirAssets , "dgzahlen.png")

nach Activity_Create

IVdg2.Initialize ("") musst Du rausnehmen.
Ist bestimmt schon wo anders definiert und initialisiert, oder ?

Ich bin nicht mehr sicher ob
IVdg2.Color = Colors.Transparent
nicht durch
csvDg.DrawRect(rectDg, Colors.Transparent, True, 1)
ersetzt werden muss.

Du könntest auch dein Programm als zip Datei posten damit wir reinschauen können um das Problem zu lösen.

Hast Du schon mal in den Beginner's Guide reingeschaut ?
Speziell Kapitel 15.2.2 Drawing rotating bitmaps / RotatingNeedle.
 

flightnet

Member
Licensed User
Longtime User
Hallo Klaus
Mercy vell mol
Ich werde es gleich mal so umvormen und schauen ob es funktioniert, das Programm umfasst etwa 3-4 tausend zeilen code bis jetzt darum habe ich nur einen teil gepostet.

Und ja ich habe es mehrheitlich mit dem beginnerguide gemacht jedoch eben, ist das heraus gekommen :/
ich versuches jetzt mal und schreibe wieder :)
 

flightnet

Member
Licensed User
Longtime User
Ich habe den code kurz gekürtz so das nur noch das was mein Problem ist da ist.
Eigentlich läuft es über die location_changed sub jedoch habe ich sie hir ersetz durch einen Timer um es besser zu simulieren.


B4X:
#Region  Project Attributes
    #ApplicationLabel: B4A Example
    #VersionCode: 1
    #VersionName:
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: False
#End Region

#Region  Activity Attributes
    #FullScreen: False
    #IncludeTitle: True
#End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    'Dim gps1 As GPS
    Dim timer1 As Timer
End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.
    Dim IVdg2 As ImageView
   
    Dim csvDg As Canvas
    Dim bmpDg As Bitmap
    Dim rectDg As Rect
   
    Dim heading As Int
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    'Activity.LoadLayout("Layout1")
   
    Activity.LoadLayout ("dg")
   
    'If FirstTime Then
    'gps1.Initialize ("GPS")
    'End If
   
    timer1.Initialize ("timer1", 1000)
   
    IVdg2.Bitmap = LoadBitmap(File.DirAssets , "dgzahlen.png")
    bmpDg.Initialize (File.DirAssets, "dgzahlen.png")
End Sub

Sub Activity_Resume
    'gps1.Start
End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub
Sub GPS_LoactionChanged (Location1 As Location)
    'heading = Location1.Bearing
    'directionalgyro_turn
End Sub
Sub directionalgyro_turn
    csvDg.DrawRect (rectDg, Colors.Transparent ,True,1)
   
End Sub
Sub Timer_tick
heading = heading + 1
End Sub
 

klaus

Expert
Licensed User
Longtime User
Und wo sind ?
csvDg.DrawBitmapRotated (bmpDg,rectDg,rectDg,heading)
IVdg2.Invalidate2 (rectDg)


und
directionalgyro_turn wird nirgenwo aufgerufen.

timer1.Enabled = True fehlt auch.

Hast Du den Code von Post 4 getestet ?
Ist das ein kleines eigenständiges Projekt ?
Wenn ja poste es als zip Datei (IDE Menu Files / Export As Zip).
 

flightnet

Member
Licensed User
Longtime User
Hier
Und sorry ja es ging ein wenig schnell tut mir leid und ich hab in getestet, jedoch erhalte ich seit eh und jeh nur fehlermeldungen. Und ja das ist ein Übungsprogramm einfach für mich, ich versuche einfach mal einen Kompass drehen zu lassen, je nach dem wie ich mich fortbewege. Und wenn ich dann mal aus den Kinderschuhen raus bin soll es in eine App eingespeisst werden.
 

Attachments

  • Kompas.zip
    10.7 KB · Views: 189

flightnet

Member
Licensed User
Longtime User
Woaaaa suppper Danke viel mals für deine Hilfe!!!!

Aber darf ich nachhacken? Ich möchte gerne meinen Fehler verstehen...

1. Was macht das genau für einen unterschied Invalidate und invalidate2? in der Code refferenz versteh ich nicht genau was gemeint ist?

Und ohh ja der 2. Fehler das ich das bitmap nicht initialisiert habe ist mir klar, schlauer ist man ja bekantlich im nachhinein immer.

aber danke schon einmal viel mals für die hilfe
 

klaus

Expert
Licensed User
Longtime User
Invalidate zeichnet die gaze View neu.
Invalidate2(rect) zeichnet nur das gegebene Rechteck neu in einer grösseren View.
Da Du die ganze View neu zeichnest kannst Du Invalidate benutzen.
Ich habe auch
csvDg.DrawBitmapRotated (bmpDg, rectDg, rectDg, heading)
durch
csvDg.DrawBitmapRotated (bmpDg, Null, rectDg, heading)
ersetzt. Weil die Bitmap nicht die gleiche Grösse hat wie die ImageView.
Null heisst die komplette Bitmap zu nehmen.
 
Top