博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[索引页]
[源码下载]


与众不同 windows phone (17) - Graphic and Animation(画图和动画)



作者:webabcd


介绍
与众不同 windows phone 7.5 (sdk 7.1) 之画图和动画

  • 图形
  • 画笔
  • 转换
  • 动画
  • 缓动



示例
1、图形(Shape)
ShapeDemo.xaml

<phone:PhoneApplicationPage 
    x:Class="Demo.GraphicAndAnimation.ShapeDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
    shell:SystemTray.IsVisible="True">

    <Grid x:Name="LayoutRoot" Background="Transparent">
        <StackPanel Name="root" Orientation="Vertical" HorizontalAlignment="Left">

            <!--
                以 xaml 的方式绘制图形
                更多详细内容请参见:
                    http://www.cnblogs.com/webabcd/archive/2008/10/23/1317407.html
                    http://www.cnblogs.com/webabcd/archive/2008/10/27/1320098.html
            -->
            
            <!--画矩形-->
            <Rectangle Width="200" Height="50" Fill="Red" Stroke="Yellow" StrokeThickness="3" />

            <!--画多条连接起来的直线-->
            <Polyline Points="10,100 50,10 100,100" Stroke="Green" StrokeThickness="20" StrokeLineJoin="Round" />

            <!--画直线-->
            <Line X1="0" Y1="0" X2="400" Y2="0" Stroke="Blue" StrokeThickness="10" StrokeDashArray="2,4,6" StrokeDashCap="Triangle" />

            <!--画椭圆-->
            <Ellipse Stroke="Red" Fill="Yellow" StrokeThickness="6" Width="100" Height="50"></Ellipse>

        </StackPanel>
    </Grid>

</phone:PhoneApplicationPage>

ShapeDemo.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;

namespace Demo.GraphicAndAnimation
{
    public partial class ShapeDemo : PhoneApplicationPage
    {
        public ShapeDemo()
        {
            InitializeComponent();

            this.Loaded += new RoutedEventHandler(ShapeDemo_Loaded);
        }

        void ShapeDemo_Loaded(object sender, RoutedEventArgs e)
        {
            // 以 代码 的方式绘制图形

            // 画多边形
            Polygon polygon = new Polygon();
            polygon.Stroke = new SolidColorBrush(Colors.Purple);
            polygon.StrokeThickness = 3d;
            polygon.Points.Add(new Point(0, 0));
            polygon.Points.Add(new Point(100, 0));
            polygon.Points.Add(new Point(0, 100));
            polygon.Points.Add(new Point(100, 100));

            root.Children.Add(polygon);
        }
    }
}


2、画笔(Brush)
BrushDemo.xaml

<phone:PhoneApplicationPage 
    x:Class="Demo.GraphicAndAnimation.BrushDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
    shell:SystemTray.IsVisible="True">

    <Grid x:Name="LayoutRoot" Background="Transparent">
        <StackPanel Name="root" Orientation="Vertical" HorizontalAlignment="Left">

            <!--
                以 xaml 的方式应用画笔
                更多详细内容请参见:
                    http://www.cnblogs.com/webabcd/archive/2008/10/30/1322658.html
            -->

            <Ellipse Margin="10" Width="200" Height="100" Stroke="Yellow" StrokeThickness="3">
                <Ellipse.Fill>
                    <!--单色画笔-->
                    <SolidColorBrush Color="#FF0000" Opacity="0.5"  />
                </Ellipse.Fill>
            </Ellipse>

            <MediaElement x:Name="mediaElement" Source="Assets/Demo.mp4" Width="0" Height="0" />
            <Rectangle Width="300" Height="100">
                <Rectangle.Fill>
                    <!--视频画笔-->
                    <VideoBrush SourceName="mediaElement" />
                </Rectangle.Fill>
            </Rectangle>
            
        </StackPanel>
    </Grid>
 
</phone:PhoneApplicationPage>

BrushDemo.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;

namespace Demo.GraphicAndAnimation
{
    public partial class BrushDemo : PhoneApplicationPage
    {
        public BrushDemo()
        {
            InitializeComponent();

            this.Loaded += new RoutedEventHandler(BrushDemo_Loaded);
        }

        void BrushDemo_Loaded(object sender, RoutedEventArgs e)
        {
            // 以 代码 的方式应用画笔

            // 使用放射性渐变画笔
            GradientStop gs1 = new GradientStop();
            gs1.Color = Colors.Red;
            gs1.Offset = 0d;
            GradientStop gs2 = new GradientStop();
            gs2.Color = Colors.Green;
            gs2.Offset = 0.3d;
            GradientStop gs3 = new GradientStop();
            gs3.Color = Colors.Blue;
            gs3.Offset = 1d;

            LinearGradientBrush brush = new LinearGradientBrush();
            brush.StartPoint = new Point(0, 0);
            brush.EndPoint = new Point(1, 1);
            brush.GradientStops.Add(gs1);
            brush.GradientStops.Add(gs2);
            brush.GradientStops.Add(gs3);

            Rectangle rect = new Rectangle();
            rect.Width = 200d;
            rect.Height = 200d;
            rect.Fill = brush;

            root.Children.Add(rect);
        }
    }
}


3、转换(Transform)
TransformDemo.xaml

<phone:PhoneApplicationPage 
    x:Class="Demo.GraphicAndAnimation.TransformDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
    shell:SystemTray.IsVisible="True">

    <Grid x:Name="LayoutRoot" Background="Transparent">
        <StackPanel Name="root" Orientation="Vertical">

            <!--
                以 xaml 的方式应用转换
                更多详细内容请参见:
                    http://www.cnblogs.com/webabcd/archive/2008/11/03/1325150.html
                    http://www.cnblogs.com/webabcd/archive/2010/08/25/1807797.html
            -->

            <!--复合转换-->
            <Rectangle Height="100" Width="100" Fill="Red">
                <Rectangle.RenderTransform>
                    <CompositeTransform SkewX="30" Rotation="60" ScaleX="0.6" ScaleY="0.3" />
                </Rectangle.RenderTransform>
            </Rectangle>

            <!-- 用 TransformGroup(多个单一转换组合在一次) 的方式达到上面的 CompositeTransform 的相同效果 -->
            <Rectangle Height="100" Width="100" Fill="Red">
                <Rectangle.RenderTransform>
                    <TransformGroup>
                        <ScaleTransform ScaleX="0.6" ScaleY="0.3" />
                        <SkewTransform AngleX="30" />
                        <RotateTransform Angle="60" />
                    </TransformGroup>
                </Rectangle.RenderTransform>
            </Rectangle>
            
        </StackPanel>
    </Grid>

</phone:PhoneApplicationPage>

TransformDemo.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;

namespace Demo.GraphicAndAnimation
{
    public partial class TransformDemo : PhoneApplicationPage
    {
        public TransformDemo()
        {
            InitializeComponent();

            this.Loaded += new RoutedEventHandler(TransformDemo_Loaded);
        }

        void TransformDemo_Loaded(object sender, RoutedEventArgs e)
        {
            // 以 代码 的方式应用转换

            // 使用旋转转换
            RotateTransform rt = new RotateTransform();
            rt.Angle = 30;

            Rectangle rect = new Rectangle();
            rect.Width = 200d;
            rect.Height = 200d;
            rect.Fill = new SolidColorBrush(Colors.Green);
            rect.RenderTransform = rt;

            root.Children.Add(rect);
        }
    }
}


4、动画(Animation)
AnimationDemo.xaml

<phone:PhoneApplicationPage 
    x:Class="Demo.GraphicAndAnimation.AnimationDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
    shell:SystemTray.IsVisible="True">

    <Grid x:Name="LayoutRoot" Background="Transparent">
        <StackPanel Name="root" Orientation="Vertical">
            
            <!--
                以 xaml 的方式增加动画效果
                更多详细内容请参见:
                    http://www.cnblogs.com/webabcd/archive/2008/11/06/1327758.html
            -->

            <!--给 Rectangle 的 Width 增加动画效果-->
            <StackPanel.Resources>
                <BeginStoryboard x:Name="beginStoryboard">
                    <Storyboard x:Name="storyboard">
                        <DoubleAnimation 
                            Storyboard.TargetName="rectangle" 
                            Storyboard.TargetProperty="Width"
                            From="200"
                            To="100"
                            Duration="00:00:03"
                            AutoReverse="True"
                            RepeatBehavior="Forever">
                        </DoubleAnimation>
                    </Storyboard>
                </BeginStoryboard>
            </StackPanel.Resources>

            <Rectangle x:Name="rectangle" Width="200" Height="100" Fill="Red" StrokeThickness="6" />

        </StackPanel>
    </Grid>

</phone:PhoneApplicationPage>

AnimationDemo.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;

namespace Demo.GraphicAndAnimation
{
    public partial class AnimationDemo : PhoneApplicationPage
    {
        public AnimationDemo()
        {
            InitializeComponent();

            this.Loaded += new RoutedEventHandler(AnimationDemo_Loaded);
        }

        void AnimationDemo_Loaded(object sender, RoutedEventArgs e)
        {
            // 以 代码 的方式增加动画效果

            // 画个圆
            Ellipse ellipse = new Ellipse();
            ellipse.Width = 100d;
            ellipse.Height = 100d;
            ellipse.Fill = new SolidColorBrush(Colors.Green);
            root.Children.Add(ellipse);


            // 为上面画的圆增加颜色动画效果
            ColorAnimation ca = new ColorAnimation();
            ca.Duration = TimeSpan.FromSeconds(2);
            ca.From = Colors.Green;
            ca.To = Colors.Blue;
            ca.AutoReverse = true;
            ca.RepeatBehavior = RepeatBehavior.Forever;

            Storyboard.SetTarget(ca, ellipse);
            Storyboard.SetTargetProperty(ca, new PropertyPath("(Ellipse.Fill).(SolidColorBrush.Color)"));

            Storyboard s = new Storyboard();
            s.Children.Add(ca);
            s.Begin();
        }
    }
}


5、缓动(Easing)
EasingDemo.xaml

<phone:PhoneApplicationPage 
    x:Class="Demo.GraphicAndAnimation.EasingDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
    shell:SystemTray.IsVisible="True">

    <Grid x:Name="LayoutRoot" Background="Transparent">
        <StackPanel Name="root" Orientation="Vertical">

            <!--
                以 xaml 的方式为动画增加缓动效果
                更多详细内容请参见:
                    http://www.cnblogs.com/webabcd/archive/2009/08/20/1550334.html
            -->

            <!--给 Rectangle 的 Width 增加动画效果,同时为此动画增加缓动效果-->
            <StackPanel.Resources>
                <BeginStoryboard x:Name="beginStoryboard">
                    <Storyboard x:Name="storyboard">
                        <DoubleAnimation Storyboard.TargetName="rectangle" Storyboard.TargetProperty="Width" From="400" To="100" Duration="00:00:05" AutoReverse="True" RepeatBehavior="Forever">
                            <DoubleAnimation.EasingFunction>
                                <!--增加缓动效果-->
                                <BounceEase EasingMode="EaseInOut" />
                            </DoubleAnimation.EasingFunction>
                        </DoubleAnimation>
                    </Storyboard>
                </BeginStoryboard>
            </StackPanel.Resources>

            <Rectangle x:Name="rectangle" Width="400" Height="100" Fill="Red" StrokeThickness="6" />

        </StackPanel>
    </Grid>
 
</phone:PhoneApplicationPage>

EasingDemo.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;

namespace Demo.GraphicAndAnimation
{
    public partial class EasingDemo : PhoneApplicationPage
    {
        public EasingDemo()
        {
            InitializeComponent(); 
            
            this.Loaded += new RoutedEventHandler(AnimationDemo_Loaded);
        }

        void AnimationDemo_Loaded(object sender, RoutedEventArgs e)
        {
            // 以 代码 的方式增加动画效果

            // 画个圆
            Ellipse ellipse = new Ellipse();
            ellipse.Width = 100d;
            ellipse.Height = 100d;
            ellipse.Fill = new SolidColorBrush(Colors.Green);
            root.Children.Add(ellipse);


            // 为上面画的圆增加颜色动画效果
            ColorAnimation ca = new ColorAnimation();
            ca.Duration = TimeSpan.FromSeconds(5);
            ca.From = Colors.Green;
            ca.To = Colors.Blue;
            ca.AutoReverse = true;
            ca.RepeatBehavior = RepeatBehavior.Forever;

            // 为颜色动画增加缓动效果
            EasingFunctionBase easing = new BounceEase();
            easing.EasingMode = EasingMode.EaseInOut;
            ca.EasingFunction = easing;

            Storyboard.SetTarget(ca, ellipse);
            Storyboard.SetTargetProperty(ca, new PropertyPath("(Ellipse.Fill).(SolidColorBrush.Color)"));

            Storyboard s = new Storyboard();
            s.Children.Add(ca);
            s.Begin();
        }
    }
}



OK
[源码下载]