bemutató - johanyak.hu
Download
Report
Transcript bemutató - johanyak.hu
Vizuális programozás
Rajzolás WPF
alkalmazásokban
2D rajzolás
Retained-mode graphics – a WPF
gondoskodik a perzisztenciáról
Rajzolási lehetőségek - szintek
– Shapes
– Drawings & Geometries
– Visuals
Közös eszközök
– Ecsetek, tollak,
– Transzformációs objektumok
Shapes - Alakzatok
Magas szintű, néhány osztály, rengeteg
metódus, tulajdonságok,
eseménykezelés, input kezelés (egér,
billentyűzet) , kényelmes használat,
Nagy memóriahasználat, lassú
Egy sor szabályos geometriai objektum
(Ellipse, Line, Polygon,PolyLine,
Rectangle, Path)
Megvalósítható: XAML-ben és C#-ban
J.Zs.Cs.: Vizuális programozás (c) 2012
XAML
Egyszerűen leírható XAML-ben:
<Ellipse Width="40" Height="50"
Stroke="Green"
StrokeThickness="2"
Fill="LightGreen" Canvas.Left="25"
Canvas.Top="30" Name="elLomb"
MouseDown="elLomb_MouseDown"
MouseMove="elLomb_MouseMove"
/>
J.Zs.Cs.: Vizuális programozás (c) 2012
C#
Double TetőMagasság=30;
Rectangle rcHáz = new Rectangle();
rcHáz.Width=110;
rcHáz.Height=80;
rcHáz.Stroke = Brushes.DarkRed;
rcHáz.StrokeThickness = 2;
rcHáz.Fill = Brushes.LightCoral;
rcHáz.SetValue(Canvas.LeftProperty,
(double)(100));
rcHáz.SetValue(Canvas.TopProperty,
(double)(100+TetőMagasság));
cvLap.Children.Add(rcHáz);
J.Zs.Cs.: Vizuális programozás (c) 2012
RectangleGeometry
LineGeometry
EllipseGeometry
PathGeometry
J.Zs.Cs.: Vizuális programozás (c) 2012
Z sorrend
A tárolóra elhelyezett alakzatok
között van egy Z-sorrend
A később feltett alakzatok elfedhetik
a korábban feltett alakzatokat
(pl. ha az elsőnek feltett alakzatot
átmozgatjuk a másodiknak feltett
alakzat pozíciójába, akkor az első a
második alá kerül).
J.Zs.Cs.: Vizuális programozás (c) 2012
Shapes – Mikor használjuk?
Felhasználói interakció szükséges
– Egér input
– ToolTip
J.Zs.Cs.: Vizuális programozás (c) 2012
Drawings & Geometries
System.Windows.Media.Drawing absztrakt
osztály leszármazottaival
Vékonyabb réteg (ún. pehelysúlyú
szolgáltatások) gyorsabb, kisebb
erőforrásigény
Nincs beépített input kezelés
Valamilyen hoszt objektumban kell
elhelyezni (pl. DrawingImage,
DrawingBrush, DrawingVisual)
Több kód szükséges
Fontosabb osztályok: GeometryDrawing,
ImageDrawing
J.Zs.Cs.: Vizuális programozás (c) 2012
Felhasnálói interakció csak jelentős
kódolás árán oldható meg
Megvalósítható: XAML-ben és C#ban
J.Zs.Cs.: Vizuális programozás (c) 2012
Drawings & Geometries – Mikor
használjuk?
Felhasználói interakció nem
szükséges (bár megoldható)
Komplex, vektor alapú grafikus
adatmegjelenítés szükséges
J.Zs.Cs.: Vizuális programozás (c) 2012
Visuals
System.Windows.Media.Visual
leszármazottai
Legvékonyabb réteg leggyorsabb;
csak elemi szolgáltatások, mindenhez
meg kell írni a kódot (legtöbb kódolás)
Nincs input esemény, felületmenedzser,
adatkötés, alacsony szintű
megközelítés
Fontosabb osztályok: DrawingVisual,
Viewport3DVisual, ContainerVisual
J.Zs.Cs.: Vizuális programozás (c) 2012
Visuals
Legkisebb erőforrásigény Legjobb
teljesítmény
Valamilyen hoszt objektumban kell
elhelyezni (pl. DrawingImage,
DrawingBrush, DrawingVisual)
Csak C#-ből oldható meg
Rajzolási kapcsolatot/eszközkapcsolatot
kell létrehozni és megnyitni, majd a
rajzolást követően lezárni (using
szerkezet használható)
J.Zs.Cs.: Vizuális programozás (c) 2012
Visuals
Az új objektumot el kell helyezni a
logikai és a vizuális fában
Át kell definiálni a
VisualChildrenCount virtuális
tulajdonságot
Át kell definiálni a GetVisualChild
virtuális metódust
Mikor használjuk? Nagy mennyiségű
adat gyors megjelenítésére
J.Zs.Cs.: Vizuális programozás (c) 2012
Vonalrajzolás - Pen
Legtöbbször nem kell közvetlenül
előállítani, az egyes alakzatok
vonaltulajdonságainak megadásával
definiálhatjuk jellemzőit
J.Zs.Cs.: Vizuális programozás (c) 2012
Vonaljellemzők megadása
<Line Stroke="Black"
StrokeEndLineCap="Triangle"
StrokeStartLineCap="Round"
StrokeThickness="15"
X1="30" Y1="30"
X2="100" Y2="30" />
<Line Stroke="Black"
StrokeThickness="10"
StrokeDashArray="2 0.4 0.4 0.4"
X1="130" Y1="30"
X2="250" Y2="30" />
J.Zs.Cs.: Vizuális programozás (c) 2012
Brush
SolidColorBrush
LinearGradientBrush
RadialGradientBrush
ImageBrush
DrawingBrush – kifestés egy olyan
objektummal, ami a Drawing leszármazottja
VisualBrush - kifestés egy olyan
objektummal, ami a Visual leszármazottja
J.Zs.Cs.: Vizuális programozás (c) 2012
Kifestés – Brush
J.Zs.Cs.: Vizuális programozás (c) 2012
Kifestés – Brush
<Ellipse Fill="#FFC42D2D" Canvas.Left="10"
Canvas.Top="100" Width="60" Height="60" />
<Ellipse Canvas.Left="100" Canvas.Top="100"
Width="60" Height="60">
<Ellipse.Fill>
<RadialGradientBrush>
<GradientStop Color="Blue" Offset="0" />
<GradientStop Color="Red" Offset="1" />
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
J.Zs.Cs.: Vizuális programozás (c) 2012
Transformations
TranslateTransform
RotateTransform
ScaleTransform
SkewTransform
MatrixTransform
TransformGroup
Demo
J.Zs.Cs.: Vizuális programozás (c) 2012
SkewTransform
http://msdn.microsoft.com/enus/library/ms746708.aspx
J.Zs.Cs.: Vizuális programozás (c) 2012
MatrixTransform
M11 M12 0
M21 M22 0
OfX OfY 1
X' = X*M11 + Y*M21 + OfX
Y' = X*M12 + Y*M22 + OfY
J.Zs.Cs.: Vizuális programozás (c) 2012
WPF animációk
Animáció
using
System.Windows.Media.Animation;
Vezérlő egy vagy több
tulajdonságának változtatása
DependencyProperty kell legyen, pl.
– WidthProperty
– HeightProperty
J.Zs.Cs.: Vizuális programozás (c) 2012
Animáció típusok
Lineáris (egyenletes) változtatás
két érték között: AdattípusAnimation
(DoubleAnimation, ColorAnimation,
ByteAnimation, stb.)
Útvonal alapú:
AdattípusAnimationUsingPath
(DoubleAnimationUsingPath)
Előredefiniált értéksor váltogatása:
AdattípusAnimationUsingKeyFrames
J.Zs.Cs.: Vizuális programozás (c) 2012
Lineáris animáció
Méretváltoztató animáció
Ha az egeret a kép fölé
visszük, kitölti a piros
vonallal megrajzolt keretet
DoubleAnimation
– From
– To
– Duration
Vezérlő.BeginAnimation
J.Zs.Cs.: Vizuális programozás (c) 2012
A felület
J.Zs.Cs.: Vizuális programozás (c) 2012
Megvalósítás
TimeSpan ts = TimeSpan.FromMilliseconds(500);
DoubleAnimation da=new DoubleAnimation();
da.From = KépSzélesség;
da.To = KépSzélesség + dSz;
da.Duration=new Duration(ts);
DoubleAnimation db=new DoubleAnimation();
db.From = KépMagasság;
db.To = KépMagasság + dM;
db.Duration = new Duration(ts);
imKép.BeginAnimation(WidthProperty,da);
imKép.BeginAnimation(HeightProperty,db);
J.Zs.Cs.: Vizuális programozás (c) 2012
Beállítási lehetőségek
From
To
By
Duration
AccelerationRatio
DecelerationRatio
SpeedRatio
AutoReverse
BeginTime
RepeatBehavior
FillBehavior
Esemény: Completed
J.Zs.Cs.: Vizuális programozás (c) 2012
Demo
KepMeretvaltoztato
TeglalapMeretvalto
J.Zs.Cs.: Vizuális programozás (c) 2012
Útvonal alapú animáció
J.Zs.Cs.: Vizuális programozás (c) 2012
J.Zs.Cs.: Vizuális programozás (c) 2012
A felület
<DockPanel>
<ToolBar DockPanel.Dock="Top" Height="30"
Name="toEszköztár">
<Button Name="btIndít"
Click="btIndít_Click"
Content="Indít"/>
</ToolBar>
<Canvas Name="cvLap" DockPanel.Dock="Top">
<Rectangle Name="rcNégyzet" Width="10"
Fill="IndianRed" Height="10" />
</Canvas>
</DockPanel>
J.Zs.Cs.: Vizuális programozás (c) 2012
Az útvonal megadása
Útvonalgeometria (PathGeometry)
– Útvonalalak (PathFigure)
Szegmens
(ArcSegment,BezierSegment,PolyBezierSeg
ment, LineSegment, PolyLineSegment,
PolyQuadraticBezierSegment,
QuadraticBezierSegment)
Szegmens …
– Útvonalalak …
…
J.Zs.Cs.: Vizuális programozás (c) 2012
Animáció
Külön az x és y koordinátára
DoubleAnimationUsingPath daxAnimáció =
new DoubleAnimationUsingPath();
daxAnimáció.PathGeometry = pgÚtvonal;
daxAnimáció.Duration =
TimeSpan.FromSeconds(10);
daxAnimáció.Source = PathAnimationSource.X;
daxAnimáció.AutoReverse = true;
rcNégyzet.BeginAnimation(Canvas.TopProperty,
daxAnimáció);
J.Zs.Cs.: Vizuális programozás (c) 2012
Előredefiniált értéksor
Demo
J.Zs.Cs.: Vizuális programozás (c) 2012