German ImageView verschieben

psciga

Active Member
Licensed User
Longtime User
Hallo,

das angehängte Beispiel generiert zuerst mehrere ImageViews (alle 1000 * 1000) und füllt sie anschließend mit Bitmaps (Auflösung 1000 * 1000 pix).

Darüber habe ich ein Panel gelegt, um das touch-event abzufangen. Damit sollen die Imageviews verschoben werden. Soweit funktioniert es auch, nur dass sich die Darstellung mit jedem Schieben verändert. Die einzelnen Bilder driften an den Kanten auseinander.

Probiert habe ich es mit PNG und GIF Files. Jedes mal das selbe Ergebnis.

Hier die Routine mit der die Views verschoben werden:

B4X:
Sub rahmen_Touch (Action As Int, X As Float, Y As Float) As Boolean
   Select Action
   Case Activity.ACTION_DOWN
      X0 = X
      Y0 = Y
      For VNum = 0 To 3
         ImvLinks(VNum) = IMVs(VNum).Left
         ImvOben(VNum) = IMVs(VNum).Top
      Next
      Return True
   Case Activity.ACTION_MOVE
      For VNum = 0 To 3
         IMVs(VNum).Left = ImvLinks(VNum) + X - X0
         IMVs(VNum).Top = ImvOben(VNum) + Y - Y0
      Next
      Return True
   Case Activity.ACTION_UP
      For VNum = 0 To 3
'         IMVs(VNum).Bitmap = BMPs(VNum)
'         IMVs(VNum).Gravity = Gravity.FILL
         IMVs(VNum).Invalidate
      Next
      Return True
   End Select
End Sub

Auch Versuche, beispielsweise bei Activity.ACTION_UP die Bilder neu zuzuweisen oder das Invalidate brachten absolut nichts mit jedem Scrollen klaffen die Bilder weiter auseinander.

Liegt es womöglich an einem Rundungsfehler, weil X und Y als Float definiert sind, ImageView.Left und .Top aber als INT?

Wo ist mein Denkfehler?

Danke im Voraus - Peter
 

Attachments

  • anfangsbild.png
    anfangsbild.png
    54.8 KB · Views: 184
  • nach_scrollen.png
    nach_scrollen.png
    53.3 KB · Views: 156

klaus

Expert
Licensed User
Longtime User
Die beiliegende geänderte Version funtioniert.
Anstatt die Left und Top Parameter jeder ImageView nach deren Position zu ändern habe Ich nur die Left und Top Parameter der ersten ImageView als Referenz genommen und die anderen nach deren Masse angepasst.
Da in der Touch Event Routine die Parameter nicht genau gleichzeitig gespeichert weden vermute dass da einige Pixel verloren gehen.
B4X:
Sub Activity_Touch(Action As Int, X As Float, Y As Float)
    Dim dx, dy As Int
    
    Select Action
    Case Activity.ACTION_DOWN
        X0 = X
        Y0 = Y
        ImvLinks = IMVs(0).Left
        ImvOben = IMVs(0).Top
    Case Activity.ACTION_MOVE
        dx =  X - X0
        dy =  Y - Y0
        For VNum = 0 To 3
            IMVs(VNum).Left = ImvLinks + dx
            IMVs(VNum).Top = ImvOben + dy + VNum * BildGroessePx
        Next
    Case Activity.ACTION_UP
    End Select
End Sub
Du kannst direkt die Activity_Touch Routine verwenden anstatt dem transparenten Panel.

Beste Grüsse.
 
Last edited:
Top