Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

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

AW: XE7: Zoom von Android App -wie?

  Alt 8. Nov 2014, 08:15
Oh, Ja, Mist - nicht für Android weil kein OpenDingsbums, dann schnell wieder weg und bloß nicht weiter anschauen

Ich dachte es geht dir um die Gesten? Warum schaust du dir nicht an dem Beispielprojekt an, wie das mit den Gesten gemacht werden muss? Das Drumherum kann dir doch egal sein. Wenn die mit einem OpenDialog Bilder öffnen und es das auf der Zielplattform nicht gibt, dann schmeiß den Rotz einfach weg. Ist doch nur Zuckerguß, denn mit den Gesten hat das nichts zu tun.

Zu deinem Testprogramm:

Ja, wo hast du denn der Anwendung gesagt wie auf die Gesten reagiert werden soll? Du hast zwar eingestellt, dass auf (und welche) Gesten reagiert werden soll, aber wie denn bitteschön? Ohne OnGesture Event wird das nichts.

Zu dem Beispielcode von Mavarik:
  • Den Ort und die Art der Deklaration von FLastDistance hättest du sehr einfach herausfinden können, wenn du dich mit dem von mir genannten Beispiel auseinandergesetzt hättest.
  • ZoomWidth und ZoomHeigth ergeben sich aus dem Kontext heraus:
    Delphi-Quellcode:
    ZoomPanel.Width := ZoomWidth * LScale;
    ZoomPanel.Height := ZoomHeight * LScale;
    Da wird also bei so einem ominösen ZoomPanel die Breite und Höhe gesetzt und errechnet wird das über einen Skalierungsfaktor LScale .
    Jetzt kommt Mathematik:
    Wenn also die Skalierung auf 1 ist (und kleiner wird die nie) if LScale < 1 then LScale := 1; , dann nimmt diese ominöse ZoomPanel die Werte aus ZoomWidth und ZoomHeigth . Ich schlussfolgere nun mal, da die Werte für das (immer noch ominöse) ZoomPanel überschrieben werden (s.o.), befinden sich in ZoomWidth und ZoomHeight die originalen Werte für ZoomPanel .
    Und weiter vermute ich anhand des Namensgebung, dass wir es hier mit jeweils einer property zu tun haben (genau wie ZoomPanel ).
Aber bevor du gleich einen Heulkrampf bekommst, hier ein abgespecktes Codebeispiel
Delphi-Quellcode:
unit Form.Main;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  FMX.Layouts, FMX.ListBox;

type
  TMainForm = class( TForm )
    ZoomPanel: TPanel;
    Label1: TLabel;
    procedure FormGesture( Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean );
  private
    FLastDistance: Integer;
    FZoomWidth, FZoomHeight: Single;
  public
    procedure AfterConstruction; override;

  end;

var
  MainForm: TMainForm;

implementation

{$R *.fmx}

procedure TMainForm.AfterConstruction;
begin
  inherited;

  Label1.Text := 'Ich kann größer werden';

  // ZoomPanel-Werte sichern

  FZoomWidth := ZoomPanel.Width;
  FZoomHeight := ZoomPanel.Height;

  // Gesten-Behandlung

  Self.OnGesture := FormGesture;
  Self.Touch.InteractiveGestures := [TInteractiveGesture.Zoom];
end;

procedure TMainForm.FormGesture( Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean );
var
  LScale, Direction: Single;
begin
  if EventInfo.GestureID = igiZoom
  then
    begin
      if not( TInteractiveGestureFlag.gfBegin in EventInfo.Flags ) and not( TInteractiveGestureFlag.gfEnd in EventInfo.Flags )
      then
        begin
          Direction := EventInfo.Distance / FLastDistance;
          LScale := ZoomPanel.Scale.X * Direction;
          if LScale < 1
          then
            LScale := 1;

          ZoomPanel.Scale.X := LScale;
          ZoomPanel.Scale.Y := LScale;

          ZoomPanel.Width := FZoomWidth * LScale;
          ZoomPanel.Height := FZoomHeight * LScale;
        end;
      FLastDistance := EventInfo.Distance;
    end;
end;

end.
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