AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Android Listview mit Bitmap

Ein Thema von greenmile · begonnen am 15. Mär 2016 · letzter Beitrag vom 19. Mär 2016
Antwort Antwort
Seite 1 von 2  1 2      
greenmile

Registriert seit: 17. Apr 2003
1.107 Beiträge
 
Delphi 10.3 Rio
 
#1

Android Listview mit Bitmap

  Alt 15. Mär 2016, 20:34
Hallo,

gibt es eigentlich in der FMX Android Listview eine einfache Möglichkeit, bei Bedarf statt ".Text" ein Bitmap anzuzeigen? Also mal so, mal so? Oder muss ich dafür einen Style anlegen und irgendwie importieren?
  Mit Zitat antworten Zitat
AndyDF

Registriert seit: 6. Sep 2006
Ort: Allgäu
99 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Android Listview mit Bitmap

  Alt 16. Mär 2016, 08:27
Hallo,

ich selbst verwende kaum noch die Properties von .Text / .Image von ItemObjects der ListView.

Ich konstruiere mir stattdessen das ListViewItem in ListView.OnUpdateObjects selbst:

Code:
procedure TFrmOverview.lvUpdateObjects(const Sender: TObject; const AItem: TListViewItem);
var
  TextLabel: TListItemText;
  Image: TListItemImage;
begin
  Image := AItem.View.FindDrawable(c_ItemDrawable_Image) as TListItemImage;
  if Image = nil then
  begin
    Image := TListItemImage.Create(AItem);
    Image.Name := c_ItemDrawable_Image;
    Image.Align := TListItemAlign.Leading;
    Image.VertAlign := TListItemAlign.Leading;
    Image.Height := c_EventImage_Heigth;
    Image.Width := c_EventImage_Width;
    Image.PlaceOffset.Y := 7;
    Image.PlaceOffset.X := 12;
    Image.ScalingMode := TImageScalingMode.Stretch;
  end;

  TextLabel := AItem.Objects.FindDrawable(c_ItemDrawable_TextHeader) as TListItemText;
  if TextLabel = nil then
  begin
    TextLabel:= TListItemText.Create(AItem);
    TextLabel.Name:= c_ItemDrawable_TextHeader;
    TextLabel.Align:= TListItemAlign.Leading;
    TextLabel.VertAlign:= TListItemAlign.Leading;
    TextLabel.TextAlign:= TTextAlign.Leading;
    TextLabel.PlaceOffset.X:= 120;
    TextLabel.PlaceOffset.Y:= 7;
    TextLabel.Font.Size:= 23;
    TextLabel.Font.Style := [TFontStyle.fsBold];
    TextLabel.Width:= 600;
    TextLabel.Height:= 30;
    TextLabel.WordWrap := false;
    TextLabel.Text:= '';
  end;
end;
Zugriff dann so:
Code:
var
  Drawable: TListItemDrawable;
begin
    Drawable := AListItem.Objects.FindDrawable(ADrawableName);

    if Assigned(Drawable) and (Drawable is TListItemText) then
      (Drawable as TListItemText).Text := AText;
end;
Vorteil, den ich da sehe: Man kann sehr flexibel sein ListViewItem aufbauen. Es ist auch möglich per .Visible einzelne Drawables auszublenden. Somit kannst du jede Zelle auch individuell gestalten.
Hoff das hilft dir.

Viele Grüße, Andy
Andreas Blenk
  Mit Zitat antworten Zitat
greenmile

Registriert seit: 17. Apr 2003
1.107 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Android Listview mit Bitmap

  Alt 16. Mär 2016, 21:03
Super, vielen Dank. Nur leider zeichnet er unter Windows das Image nicht links sondern addiert was dazu. Der ursprüngliche Test wird leider nicht entfernt (AItem.Text := ''). Und unter Android wird garnichts gezeichnet:

Code:
Function TfrmMain.GetBitmap(Name: String; var Target: TBitmap): Boolean;
  var
    Size: TSize;
    Item: TCustomBitmapItem;
begin
  If imgList.BitmapItemByName(Lowercase(Name), Item, Size) then begin
    Target.Assign(Item.Bitmap);
    Result := true;
  end else Result := false;
end;

...

var
   TextLabel: TListItemText;
   Image: TListItemImage;
   MyBitmap: TBitmap;
const
  c_ItemDrawable_Image = 'ItemImage';
  c_ItemDrawable_TextHeader = 'ItemText';
  c_EventImage_Heigth = 25;
  c_EventImage_Width = 100;
begin
  MyBitmap := TBitmap.Create;
  If GetBitmap(AItem.Text, MyBitmap) then begin
    Image := AItem.View.FindDrawable(c_ItemDrawable_Image) as TListItemImage;
    if (Image=nil)then begin
      Image          := TListItemImage.Create(AItem);
      Image.Name     := c_ItemDrawable_Image;
      Image.Align    := TListItemAlign.Leading;
      Image.VertAlign := TListItemAlign.Leading;
      Image.Height   := c_EventImage_Heigth;
      Image.Width    := MyBitmap.Width;
      Image.PlaceOffset.X := 30;
      Image.PlaceOffset.Y := 10;
      If not Assigned(Image.Bitmap) then Image.Bitmap := TBitmap.Create;
      Image.OwnsBitmap := false;
      Image.Bitmap.Assign(MyBitmap);
    end;
    AItem.Text := '';
    AItem.Invalidate;
    Exit;
  end;

  TextLabel := AItem.Objects.FindDrawable(c_ItemDrawable_TextHeader) as TListItemText;
  if TextLabel = nil then begin
    TextLabel:= TListItemText.Create(AItem);
    TextLabel.Name:= c_ItemDrawable_TextHeader;
    TextLabel.Align:= TListItemAlign.Leading;
    TextLabel.VertAlign:= TListItemAlign.Leading;
    TextLabel.TextAlign:= TTextAlign.Leading;
    TextLabel.PlaceOffset.X:= 40;
    TextLabel.PlaceOffset.Y:= 4;
    TextLabel.Font.Size:= 23;
    TextLabel.Font.Style := [TFontStyle.fsBold];
    TextLabel.Width:= 600;
    TextLabel.Height:= 30;
    TextLabel.WordWrap := false;
    TextLabel.Text:= AItem.Text;
    AItem.Text := '';
    AItem.Invalidate;
  end;

Geändert von greenmile (16. Mär 2016 um 21:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Android Listview mit Bitmap

  Alt 16. Mär 2016, 21:41
Euch ist schon bewusst dass ihr hier das Gleiche macht wie mit den Styles - nur wesentlich umständlicher

Warum nehmt ihr die Code-Tags und nicht die Delphi-Tags?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
greenmile

Registriert seit: 17. Apr 2003
1.107 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Android Listview mit Bitmap

  Alt 16. Mär 2016, 21:53
Naja umständlicher vielleicht, aber ich habe so meine Erfahrung mit den Styles. Gebranntes Kind scheut das Feuer und bis vor kurzem war diese ganze Style-Brühe mehr als Schrott. Vielleicht haben sie sich inzwischen gemausert, keine Ahnung, aber nachdem ich schon einige Male in der Vergangenheit Properties verloren habe, sie plötzlich beim Neu-Laden des Projektes anders aussahen oder einfach verloren gegangen sind, weil ich die Delphi Version aktualisiert habe ... Ne danke. Firemonkey ist eine Zicke. An sich ganz cool wenn man weiß, wie man mit ihr umgehen muss.

Anyway möchte ich nicht immer Bitmaps verwenden und so kann ich gezielt und einfach im Source ein Bitmap einblenden oder eben auch nicht.

BTW: In Android sind sie nicht sichtbar. Andy, hast Du da ev eine Idee?
  Mit Zitat antworten Zitat
AndyDF

Registriert seit: 6. Sep 2006
Ort: Allgäu
99 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Android Listview mit Bitmap

  Alt 17. Mär 2016, 15:11
Ich habe mir deinen Code nochmal angesehen. Also ich habe überhaupt keine Probleme mit iOS oder Android. Unter Windows schaut es manchmal nicht so aus wie ich es gerne hätte. Aber das ist in diesem Fall bei mir auch keine Zielplattform. iOS u. Android passt perfekt.

Zu Styles: Für meinen Fall muss ich ehrlich sagen, fahre ich auf diese Weise sehr gut. Da meine Oberfläche recht flexibel sein muss kann ich hier ganz gut reagieren.

Letztendlich mache ich nichts anderes als in "TFrmOverview.lvUpdateObjects" das Item zu "designen" und in einer eigenen Methode "DataToGui" das Item zu befüllen. Das funktioniert bei mir.

Ein paar Hinweise, die mir als Unterschiede auffallen:

- "TFrmOverview.lvUpdateObjects" mach immer das Selbe bei mir! Das Bitmap wird nicht in dieser Methode gesetzt. Wenn ich das Bild dann später nicht sehen will, setze ich .Visible auf false (in DataToGui). Bzw. ich weise gar kein TBitmap zu. Wenn das Objekt nil bleibt ist nichts zu sehen.
- Atem.Invalidate -> wofür?
- Die Reihenfolge in "TFrmOverview.lvUpdateObjects" ist entscheidend! In dieser Reihenfolge wird es übereinander gezeichnet.
- je nachdem woher du das Bild bekommst, musst du "OwnsBitmap" entsprechen setzen. Aber das machst du ja schon.
- ListView.ItemAppearance.ItemAppearance ist bei mir auf Custom. ItemHeight ist auch passend gesetzt.
- Ja das ist richtig, die standard Properties .Text / .Image werden immer noch angezeigt. Hierzu habe ich im Eigenschaftenexplorer alle auf Visible := false gesetzt! Die bleiben dann bei mir einfach unbeachtet, da ich das Item komplett selbst aufbaue.
- Für die Positionierung auch unbedingt ListView.ItemSpaces berücksichtigen! Meiner Erfahrung nach muss der Wert für Top und Bottom sogar in der ItemHeight mit einbezogen werden.

Hier noch meine Methode zum Setzen des Bitmaps (aus DataToGui() heraus):

Delphi-Quellcode:
class procedure TListViewHelper.SetListItemImage(const AListItem: TListViewItem; const ADrawableName: String; const ABitmap: TBitmap; const AOwnsBitmap: Boolean);
var
  Drawable: TListItemDrawable;
begin
  if Assigned(AListItem) then
  begin
    Drawable := AListItem.Objects.FindDrawable(ADrawableName);

    if Assigned(Drawable) and (Drawable is TListItemImage) then
    begin
      (Drawable as TListItemImage).BeginUpdate;
      try
        (Drawable as TListItemImage).Bitmap := nil;
        (Drawable as TListItemImage).OwnsBitmap := AOwnsBitmap;
        (Drawable as TListItemImage).Bitmap := ABitmap;
      finally
        (Drawable as TListItemImage).EndUpdate;
      end;
    end;
  end;
end;
Ab jetzt nehme ich die Delphi Tags
Andreas Blenk
  Mit Zitat antworten Zitat
greenmile

Registriert seit: 17. Apr 2003
1.107 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Android Listview mit Bitmap

  Alt 17. Mär 2016, 21:06
Sehr geil! Vielen Dank, das hat mir wirklich weiter geholfen. Habe allerdings eine kleine Änderung, damit die Bilder auch wirklich Leading sind:

Delphi-Quellcode:
class procedure TListViewHelper.SetListItemImage(const AListItem: TListViewItem; const ADrawableName: String; const ABitmap: TBitmap; const AOwnsBitmap: Boolean);
var
  Drawable: TListItemDrawable;
begin
  if Assigned(AListItem) then
  begin
    Drawable := AListItem.Objects.FindDrawable(ADrawableName);

    if Assigned(Drawable) and (Drawable is TListItemImage) then
    begin
      (Drawable as TListItemImage).BeginUpdate;
      try
        (Drawable as TListItemImage).Bitmap := nil;
        (Drawable as TListItemImage).OwnsBitmap := AOwnsBitmap;
        (Drawable as TListItemImage).Bitmap := ABitmap;
--->
         If Assigned(ABitmap) then begin
           (Drawable as TListItemImage).Width := ABitmap.Width;
         end;
--->
      finally
        (Drawable as TListItemImage).EndUpdate;
      end;
    end;
  end;
end;
Ab jetzt nehme ich die Delphi Tags
  Mit Zitat antworten Zitat
AndyDF

Registriert seit: 6. Sep 2006
Ort: Allgäu
99 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Android Listview mit Bitmap

  Alt 18. Mär 2016, 16:30
Super wenn es geklappt hat und danke noch für die Erweiterung.

Benötige ich aber in meinem Fall nicht, da ich die Bitmaps schon mit der richtigen Größe definiere bzw. den ScalingMode entsprechend setze:

Image.ScalingMode := TImageScalingMode.Stretch;
Andreas Blenk
  Mit Zitat antworten Zitat
greenmile

Registriert seit: 17. Apr 2003
1.107 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Android Listview mit Bitmap

  Alt 18. Mär 2016, 19:20
Klappt 1a und löst ein schon länger vorhandenes Problem, das Bier geht auf mich!

Einzig der dynamische Label (TListItemText) bereitet mir noch Sorgen. Ich möchte gerne die Schriftgröße von einem Original-Eintrag setzen, finde aber nicht raus, wie groß die ist. Ist die konstant, kann ich also immer Font.Size 20 nehmen? Kann ich mir kaum vorstellen, sonst wäre die Größe auf einem Tablet ja identisch mit der auf einem Handy.

Den Original Text musste ich auch über den Objektinspektor ausblenden. Wenn ich es per Source mache, ist der manchmal nach einem Refresh (Gerät Lock/Unlock) plötzlich wieder da.
  Mit Zitat antworten Zitat
AndyDF

Registriert seit: 6. Sep 2006
Ort: Allgäu
99 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Android Listview mit Bitmap

  Alt 19. Mär 2016, 09:54
Das mit der "(Default)" Font-Size hatte ich mich auch schon mal gefragt. Wie ist diese definiert? Gibt es hierfür Konstanten?

Was mir hier spontan als möglicher Workaround einfällt:
Lege doch ein TLabel auf die Form und mach dieses Visible := False. Von diesem kannst du dir dann die Font-Size holen und bei deinem TListItemText setzen. Dann müsste es doch die Default-Size sein oder?
Andreas Blenk
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz