AGB  ·  Datenschutz  ·  Impressum  







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

Opaciy Problem in Firemonkey

Ein Thema von ht47 · begonnen am 3. Nov 2015 · letzter Beitrag vom 7. Nov 2015
Antwort Antwort
ht47

Registriert seit: 3. Nov 2015
2 Beiträge
 
#1

Opaciy Problem in Firemonkey

  Alt 3. Nov 2015, 11:32
Hallo,

ich experimentiere derzeitig ein wenig mit Delphi XE7 und Firemonkey. Ich habe aber ein Problem mit Drawline und der Opacity Einstellung.

Ich benutze eine Form mit einem Button und einer Paintbox. Im OnClick des Buttons nutze ich folgenden Code:

begin
PaintBox1.Canvas.BeginScene;
PaintBox1.Canvas.DrawLine(PointF(10,10),PointF(110 ,10),1);
PaintBox1.Canvas.DrawLine(PointF(110,10),PointF(11 0,110),1);
PaintBox1.Canvas.DrawLine(PointF(110,110),PointF(1 0,110),1);
PaintBox1.Canvas.DrawLine(PointF(10,110),PointF(10 ,10),1);
PaintBox1.EndScene;
end;

Das Zeichnen funktioniert eigentlich problemlos. Nur werden die Linie nicht in vollem schwarz gezeichnet, sondern höchstens in 50 % Deckung. Woran kann das liegen ?

Grüße

Holger
  Mit Zitat antworten Zitat
Darlo

Registriert seit: 28. Jul 2008
Ort: München
1.196 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

AW: Opaciy Problem in Firemonkey

  Alt 3. Nov 2015, 11:50
Was für eine Tickness hast Du dnen eingestellt? Kann es sein, dass bei Tickness := 1 das aufgrund von Kantenglättung einfach so wirkt?
Philip
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Opaciy Problem in Firemonkey

  Alt 3. Nov 2015, 11:54
Hallo und Willkommen in den Heiligen Hallen des Wissens und des Wahnsinns

Der Deckungsgrad ist mit 1.0 schon richtig gewählt. Es liegt an der Dicke des Stifts. Füge nach deinem BeginScene() mal die Zeile PaintBox1.Canvas.StrokeThickness := 0.75; ein und der Effekt verstärkt sich noch!

Es wäre nämlich zu einfach gewesen auf glatten Koordinaten wie (100 | 0) zu zeichnen, du musst jeweils die halbe Stiftbreite wieder abziehen.

Hier als Beispiel einmal das ständige Abziehen einmal in eine lokale Prozedur "draw" ausgelagert. Im Nachhinein merke ich dass es wohl schlauer gewesen wäre das als Klassenhelfer zu machen

Delphi-Quellcode:
procedure TForm3.Button1Click(Sender: TObject);
var
   fromPoint:   TPointF;
   toPoint:   TPointF;
   draw:      TProc<TPointF, TPointF>;
begin
   draw :=
      procedure(fromPoint, toPoint: TPointF)
      var
         offset: Single;
      begin
         offset := PaintBox1.Canvas.StrokeThickness / 2.0;
         fromPoint.Offset(-offset, -offset);
         toPoint.Offset(-offset, -offset);
         PaintBox1.Canvas.DrawLine(fromPoint, ToPoint, 1.0);
      end;

   PaintBox1.Canvas.BeginScene();
   try
      fromPoint := TPointF.Create(10, 10);
      toPoint := fromPoint; toPoint.Offset(100, 0);
      draw(fromPoint, toPoint);

      fromPoint.Offset(100, 0); toPoint.Offset(0, 100);
      draw(fromPoint, toPoint);

      fromPoint.Offset(0, 100); toPoint.Offset(-100, 0);
      draw(fromPoint, toPoint);

      fromPoint.Offset(-100, 0); toPoint.Offset(0, -100);
      draw(fromPoint, toPoint);
   finally
      PaintBox1.Canvas.EndScene();
   end;
end;
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.910 Beiträge
 
Delphi 12 Athens
 
#4

AW: Opaciy Problem in Firemonkey

  Alt 4. Nov 2015, 09:36
Man könnte auch gleich ein Polygon zeichnen wenn mehrere Linien verbunden sind:


Code:
procedure S4Canvas_Polyline_Draw(const Canvas: TCanvas;
                                 const Points: TPolygon;
                                 const AOpacity: Single);
var
  I: Integer;
{$IFNDEF IOS}
  Path: TPathData;
{$ENDIF IOS}

begin

{$IFDEF IOS}

  try
    // BugFix: Must draw the polygon as single-line sequence: TPathData doesn'T work here
    //Update:
    // Das war bei XE8, mit Rx10 noch nicht getestet, vielleicht passt es jetzt.
    // Hat sicher etwas mit SceneScale zu tun ...

    for I := 1 to High(Points) do
    begin
       Canvas.DrawLine(Points[I-1], Points[I], AOpacity );
    end;

  finally

  end;


{$ELSE not IOS}

  Path := TPathData.Create;

  try
    for I := 0 to High(Points) do
    begin
      if I = 0 then
        Path.MoveTo(Points[I])
      else
        Path.LineTo(Points[I]);
    end;

    Canvas.DrawPath(Path, AOpacity);

  finally
    Path.Free;
    Path := nil;
  end;


{$ENDIF not IOS}

end;
Rollo

Geändert von Rollo62 ( 4. Nov 2015 um 09:40 Uhr)
  Mit Zitat antworten Zitat
ht47

Registriert seit: 3. Nov 2015
2 Beiträge
 
#5

AW: Opaciy Problem in Firemonkey

  Alt 7. Nov 2015, 01:26
Hallo,

Danke für die Hilfe. Jetzt funktioniert es.

Holger
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:04 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