zoukankan      html  css  js  c++  java
  • 在Windows8 Winrt中 高性能处理多个条件语句 用于实现自定义手势

    http://blog.csdn.net/wangrenzhu2011/article/details/8578806 (转)

    在winrt中 多点触控 控件的应用越来越多,例如 各种手势与 控件之间的互动,如常规的:放大缩小,滑动,旋转,轻扫等。。

    但是如果我们需要自定义一些手势,那么需要大量的条件语句判断,严重的影响了性能,往往这些判断在ui 中计算,当触控点过多时会引起系统内响应过慢。

     

    当然 常规的解决办法是将这些条件判断放置在多线程中处理。但是该方式治标不治本,条件过多时,代码会显得非常混乱 难以维护。。

    下面我将介绍一种比较合理的方式处理该问题。

     

     

    通过Predict定义多个条件,通过Action或者Func 来实现判断之后的效果。

    Dictionary<Predicate<int>, Action> testDict = new Dictionary<Predicate<int>, Action>();

    或者Dictionary<Predicate<int>, Task<Action>> testDict = new Dictionary<Predicate<int>, Task<Action>>();

    Dictionary<Predicate<int>, Func<int>> testDict = new Dictionary<Predicate<int>, Func<int>>();

     

    我们以第一个testDict 写一个sample验证一下。

     

    [csharp] view plaincopyprint?
     
    1. using System;  
    2. using System.Collections.Generic;  
    3. using System.Diagnostics;  
    4. using System.IO;  
    5. using System.Linq;  
    6. using System.Threading.Tasks;  
    7. using Windows.Foundation;  
    8. using Windows.Foundation.Collections;  
    9. using Windows.UI.Input;  
    10. using Windows.UI.Xaml;  
    11. using Windows.UI.Xaml.Controls;  
    12. using Windows.UI.Xaml.Controls.Primitives;  
    13. using Windows.UI.Xaml.Data;  
    14. using Windows.UI.Xaml.Input;  
    15. using Windows.UI.Xaml.Media;  
    16. using Windows.UI.Xaml.Navigation;  
    17.   
    18. // “空白页”项模板在 http://go.microsoft.com/fwlink/?LinkId=234238 上有介绍  
    19.   
    20. namespace Test  
    21. {  
    22.     /// <summary>  
    23.     /// 可用于自身或导航至 Frame 内部的空白页。  
    24.     /// </summary>  
    25.     public sealed partial class MainPage : Page  
    26.     {  
    27.         public MainPage()  
    28.         {  
    29.             this.InitializeComponent();  
    30.   
    31.             this.PointerPressed += ((sender, e) =>  
    32.             {  
    33.                 var p = e.GetCurrentPoint(this);  
    34.                 var currentPoint = p;  
    35.                 var start = DateTime.Now.Millisecond;  
    36.                 var x = Convert.ToInt32(p.Position.X);  
    37.                 foreach (var item in testDict.  
    38.                     Where(o =>  
    39.                     {  
    40.                         return Task<bool>.Run(() =>  
    41.                         {  
    42.                             return o.Key(x);  
    43.                         }).Result;  
    44.                     }))  
    45.                 {  
    46.   
    47.                     item.Value();  
    48.   
    49.                 }  
    50.                 var end = DateTime.Now.Millisecond;  
    51.                 Debug.WriteLine(start);  
    52.                 Debug.WriteLine(end);  
    53.                 Debug.WriteLine("时差:" + (start - end).ToString());  
    54.             });  
    55.         }  
    56.   
    57.         Dictionary<Predicate<int>, Action> testDict = new Dictionary<Predicate<int>, Action>();  
    58.         /// <summary>  
    59.         /// 在此页将要在 Frame 中显示时进行调用。  
    60.         /// </summary>  
    61.         /// <param name="e">描述如何访问此页的事件数据。Parameter  
    62.         /// 属性通常用于配置页。</param>  
    63.         protected override void OnNavigatedTo(NavigationEventArgs e)  
    64.         {  
    65.             Predicate<int> pp = CheckPointer;  
    66.             testDict.Add(CheckPointer, async () =>  
    67.             {  
    68.                 await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () =>  
    69.                 {  
    70.                     TextBlock tb = new TextBlock();  
    71.                     tb.Text = "打印";  
    72.                     lv.Items.Add(tb);  
    73.                 });  
    74.             });  
    75.         }  
    76.   
    77.         public static bool CheckPointer(int p)  
    78.         {  
    79.             for (int i = 9999999; i > 0; i--)  
    80.             {  
    81.                 if (i == p)  
    82.                 {  
    83.                     return true;  
    84.                 }  
    85.             }  
    86.             return false;  
    87.         }  
    88.   
    89.   
    90.   
    91.         private void Button_Click_1(object sender, RoutedEventArgs e)  
    92.         {  
    93.   
    94.         }  
    95.     }  
    96. }  


     

    1. <Page  
    2.     x:Class="Test.MainPage"  
    3.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    4.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
    5.     xmlns:local="using:Test"  
    6.     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"  
    7.     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"  
    8.     mc:Ignorable="d">  
    9.   
    10.     <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">  
    11.         <Button Content="Button" HorizontalAlignment="Left" Margin="496,61,0,0" VerticalAlignment="Top" Click="Button_Click_1"/>  
    12.         <ListView x:Name="lv" HorizontalAlignment="Left" Height="558" Margin="973,43,0,0" VerticalAlignment="Top" Width="256"/>  
    13.   
    14.     </Grid>  
    15. </Page>  


     

    这个例子非常的简单,在page上触发点击操作之后将会触发predict中的条件判断

    循环999999次 计算量较多,如果在ui线程中直接运行该判断将会造成ui卡死,

    但是通过predict 的线程中处理之后 可以快速响应 结果,并将打印输出到listview中

    当然 我们可以添加多个 predict 条件 以及相应的Action结果  来响应不同的触控,来实现各种自定义手势。

    每一种手势将使用一个单独的predict  和相应的Action ,这么做的好处是 将 各种判断抽象化 为工厂模式,方便后期维护,以及2次开发。

    我们可以通过程序初始化的时候 配合数据库 在Dictionary里 增加不同的predict 和不同的Action 来完成 配置化。

    大家可以通过该模式 扩展,用于多点识别manipulation 或者其他方向。

    以上 介绍到此

  • 相关阅读:
    关于Python3中venv虚拟环境
    Python爬虫番外篇之关于登录
    站在圈外看待小米公司发展史
    Python爬虫从入门到放弃(十九)之 Scrapy爬取所有知乎用户信息(下)
    Python爬虫从入门到放弃(十八)之 Scrapy爬取所有知乎用户信息(上)
    Python爬虫番外篇之Cookie和Session
    Python爬虫从入门到放弃(十七)之 Scrapy框架中Download Middleware用法
    Python爬虫从入门到放弃(十六)之 Scrapy框架中Item Pipeline用法
    openstack的网络、子网、端口的关系
    openstack之安全组管理
  • 原文地址:https://www.cnblogs.com/CharlesGrant/p/3639386.html
Copyright © 2011-2022 走看看