zoukankan      html  css  js  c++  java
  • windows phone:动画(三)

    UI线程与渲染线程

    大部分Silverlight的应用程序运行在一个线程中,这个线程就是UI线程(使用的是CPU)。UI线程处理触摸输入、布局和CompositionTarget.Rendering事件。

    而有些动画则运行在一个使用GPU(即图形处理单元)的线程上,这个线程称为渲染线程。这个渲染线程为一些double类型的属性制作动画,特别是下面这些double类型的属性:

    设置到RenderTransform属性的变形;

    设置到Projection属性的透视变形;

    Canvas.Left和Canvas.To附加属性;

    Opacity属性;

    任何导致矩形发生裁切的元素;

    而通过Color和Point类型的属性制作的动画仍然在UI线程中运行。

    下面示例演示了UI线程与渲染线程:

    xaml文件片段如下所示:

        <phone:PhoneApplicationPage.Resources>
            <Storyboard x:Name="storyboard">
                <DoubleAnimation Storyboard.TargetName="rotate2"
                                 Storyboard.TargetProperty="Angle"
                                 From="0" To="360" Duration="0:1:0"
                                 RepeatBehavior="Forever" />
            </Storyboard>
        </phone:PhoneApplicationPage.Resources>

        ...

         <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
                <Grid.RowDefinitions>
                    <RowDefinition Height="*" />
                    <RowDefinition Height="*" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>

                <TextBlock Grid.Row="0"
                           Text="UI Thread"
                           FontSize="{StaticResource PhoneFontSizeLarge}"
                           HorizontalAlignment="Center"
                           VerticalAlignment="Center"
                           RenderTransformOrigin="0.5 0.5">
                    <TextBlock.RenderTransform>
                        <RotateTransform x:Name="rotate1" />
                    </TextBlock.RenderTransform>
                </TextBlock>

                <TextBlock Grid.Row="1"
                           Text="Render Thread"
                           FontSize="{StaticResource PhoneFontSizeLarge}"
                           HorizontalAlignment="Center"
                           VerticalAlignment="Center"
                           RenderTransformOrigin="0.5 0.5">
                    <TextBlock.RenderTransform>
                        <RotateTransform x:Name="rotate2" />
                    </TextBlock.RenderTransform>
                </TextBlock>

                <Button Grid.Row="2"
                        Content="Hang for 5 seconds"
                        HorizontalAlignment="Center"
                        Click="OnButtonClick" />
            </Grid>

    代码文件片段如下:

        public partial class Page1 : PhoneApplicationPage
        {
            public Page1()
            {
                InitializeComponent();
                storyboard.Begin();
                startTime = DateTime.Now;
                CompositionTarget.Rendering += OnCompositionTargetRendering;
            }
            DateTime startTime;

            void OnCompositionTargetRendering(object sender, EventArgs args)
            {
                TimeSpan elapsedTime = DateTime.Now - startTime;
                rotate1.Angle = (elapsedTime.TotalMinutes * 360) % 360;
            }

            void OnButtonClick(object sender, RoutedEventArgs args)
            {
                Thread.Sleep(5000);
            }
        }

    运行程序后,两个文本几乎一致旋转,但当你按下按钮时就会发现:使用CompositionTarget.Rendering来旋转的文本停止了5秒,但是使用DoubleAnimation旋转的文本一直在运行。为什么呢?这是因为使用DoubleAnimation旋转的动画是运行在渲染线程中的,而Thread.Sleep()停止的是当前线程,这里即UI线程。

  • 相关阅读:
    百度开源其NLP主题模型工具包,文本分类等场景可直接使用L——LDA进行主题选择本质就是降维,然后用于推荐或者分类
    谷歌开源可视化工具Facets,将用于人+AI协作项目研究——无非就是一个用于特征工程探索的绘图工具集,pandas可以做的
    机器学习案例 特征组合——高帅富 冷启动——从微博等其他渠道搜集数据进行机器学习 用户年龄——线性分段处理
    pyspark MLlib踩坑之model predict+rdd map zip,zip使用尤其注意啊啊啊!
    [038] 微信公众帐号开发教程第14篇-自定义菜单的创建及菜单事件响应
    [037] 微信公众帐号开发教程第13篇-图文消息全攻略
    [036] 微信公众帐号开发教程第12篇-符号表情的发送(下)(转)
    [035] 微信公众帐号开发教程第11篇-符号表情的发送(上)(转)
    [034] 微信公众帐号开发教程第10篇-解析接口中的消息创建时间CreateTime(转)
    [033] 微信公众帐号开发教程第9篇-QQ表情的发送与接收(转)
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/2980735.html
Copyright © 2011-2022 走看看