在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验证一下。
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.IO;
- using System.Linq;
- using System.Threading.Tasks;
- using Windows.Foundation;
- using Windows.Foundation.Collections;
- using Windows.UI.Input;
- using Windows.UI.Xaml;
- using Windows.UI.Xaml.Controls;
- using Windows.UI.Xaml.Controls.Primitives;
- using Windows.UI.Xaml.Data;
- using Windows.UI.Xaml.Input;
- using Windows.UI.Xaml.Media;
- using Windows.UI.Xaml.Navigation;
- // “空白页”项模板在 http://go.microsoft.com/fwlink/?LinkId=234238 上有介绍
- namespace Test
- {
- /// <summary>
- /// 可用于自身或导航至 Frame 内部的空白页。
- /// </summary>
- public sealed partial class MainPage : Page
- {
- public MainPage()
- {
- this.InitializeComponent();
- this.PointerPressed += ((sender, e) =>
- {
- var p = e.GetCurrentPoint(this);
- var currentPoint = p;
- var start = DateTime.Now.Millisecond;
- var x = Convert.ToInt32(p.Position.X);
- foreach (var item in testDict.
- Where(o =>
- {
- return Task<bool>.Run(() =>
- {
- return o.Key(x);
- }).Result;
- }))
- {
- item.Value();
- }
- var end = DateTime.Now.Millisecond;
- Debug.WriteLine(start);
- Debug.WriteLine(end);
- Debug.WriteLine("时差:" + (start - end).ToString());
- });
- }
- Dictionary<Predicate<int>, Action> testDict = new Dictionary<Predicate<int>, Action>();
- /// <summary>
- /// 在此页将要在 Frame 中显示时进行调用。
- /// </summary>
- /// <param name="e">描述如何访问此页的事件数据。Parameter
- /// 属性通常用于配置页。</param>
- protected override void OnNavigatedTo(NavigationEventArgs e)
- {
- Predicate<int> pp = CheckPointer;
- testDict.Add(CheckPointer, async () =>
- {
- await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () =>
- {
- TextBlock tb = new TextBlock();
- tb.Text = "打印";
- lv.Items.Add(tb);
- });
- });
- }
- public static bool CheckPointer(int p)
- {
- for (int i = 9999999; i > 0; i--)
- {
- if (i == p)
- {
- return true;
- }
- }
- return false;
- }
- private void Button_Click_1(object sender, RoutedEventArgs e)
- {
- }
- }
- }
- <Page
- x:Class="Test.MainPage"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:local="using:Test"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- mc:Ignorable="d">
- <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
- <Button Content="Button" HorizontalAlignment="Left" Margin="496,61,0,0" VerticalAlignment="Top" Click="Button_Click_1"/>
- <ListView x:Name="lv" HorizontalAlignment="Left" Height="558" Margin="973,43,0,0" VerticalAlignment="Top" Width="256"/>
- </Grid>
- </Page>
这个例子非常的简单,在page上触发点击操作之后将会触发predict中的条件判断
循环999999次 计算量较多,如果在ui线程中直接运行该判断将会造成ui卡死,
但是通过predict 的线程中处理之后 可以快速响应 结果,并将打印输出到listview中
当然 我们可以添加多个 predict 条件 以及相应的Action结果 来响应不同的触控,来实现各种自定义手势。
每一种手势将使用一个单独的predict 和相应的Action ,这么做的好处是 将 各种判断抽象化 为工厂模式,方便后期维护,以及2次开发。
我们可以通过程序初始化的时候 配合数据库 在Dictionary里 增加不同的predict 和不同的Action 来完成 配置化。
大家可以通过该模式 扩展,用于多点识别manipulation 或者其他方向。
以上 介绍到此
在Windows8 Winrt中 高性能处理多个条件语句 用于实现自定义手势的更多相关文章
- Yii数据库子查询嵌入select中,而不是where条件语句中
$subQuery = (new Query())->select('COUNT(*)')->from('user'); // SELECT `id`, (SELECT COUNT(*) ...
- 将 C++/WinRT 中的线程切换体验带到 C# 中来(WPF 版本)
原文:将 C++/WinRT 中的线程切换体验带到 C# 中来(WPF 版本) 如果你要在 WPF 程序中使用线程池完成一个特殊的任务,那么使用 .NET 的 API Task.Run 并传入一个 L ...
- JOIN关联表中ON,WHERE后面跟条件的区别
select * from td left join (select case_id as sup_case_id , count(*) supervise_number from td_kcdc ...
- WPF:指定的命名连接在配置中找不到、非计划用于 EntityClient 提供程序或者无效的解决方法
文/嶽永鹏 WPF 数据绑定中绑定到ENTITY,如果把数据文件做成一个类库,在UI文件中去应用它,可能遇到下面这种情况. 指定的命名连接在配置中找不到.非计划用于 EntityClient 提供程序 ...
- java中的条件语句(if、if...else、多重if、嵌套if)
Java条件语句之 if 生活中,我们经常需要先做判断,然后才决定是否要做某件事情.例如,如果考试成绩大于 90 分,则奖励一个 IPHONE 5S .对于这种"需要先判断条件,条件满足后才 ...
- postgres中几个复杂的sql语句
postgres中几个复杂的sql语句 需求一 需要获取一个问题列表,这个问题列表的排序方式是分为两个部分,第一部分是一个已有的数组[0,579489,579482,579453,561983,561 ...
- C#中使用Sql对Excel条件查询
如何在C#中实现对Excel的条件查询呢? 在使用Sql条件语句对Excel进行查询时,遇到"至少一个参数没有被指定值"的问题,如何解决? 使用OleDbConnection对象创 ...
- Android中View的绘制过程 onMeasure方法简述 附有自定义View例子
Android中View的绘制过程 onMeasure方法简述 附有自定义View例子 Android中View的绘制过程 当Activity获得焦点时,它将被要求绘制自己的布局,Android fr ...
- js中的条件语句
//js中的条件语句 ; //example1 单分支语句 ){ console.log("你已经不年轻了!"); }else{ console.log("你依然很有活力 ...
随机推荐
- HDU2546(01背包饭卡)
电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够).所以大家 ...
- Linux Tomcat 简介
如今,基于Web的应用越来越多,传统的Html已经满足不了如今的需求.我们需要一个交互式的Web,于是便诞生了各种Web语言.如Asp,Jsp,Php等.当然,这些语言与传统的语言有着密切的联系,如P ...
- Cannot locate factory for objects of type DefaultGradleConnector, as ConnectorServiceRegistry has been closed.
现象:更换android studio libs文件夹下的jar包,重新编译代码报错:Cannot locate factory for objects of type DefaultGradleCo ...
- Python爬虫经验
有时候读取同一个url,服务器可能会返回不同的response,并不是爬虫程序代码的问题,而是服务器的问题,初次试验request时,最好 把response文本保存在一个txt文件当中,以便后续的比 ...
- RabbitMQ消息队列:ACK机制
每个Consumer可能需要一段时间才能处理完收到的数据.如果在这个过程中,Consumer出错了,异常退出了,而数据还没有处理完成,那么 非常不幸,这段数据就丢失了. 因为我们采用no-ack的方式 ...
- 【原创】Js:日期处理(日期格式必须【yyyy-mm-dd】才能转成long的毫秒!其他的不是【年-月-日】的格式,结果会是【NaN】)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- windows2003批量添加和导出所有ip
批量添加IP 在cmd命令行下运行: FOR /L %i IN (130,1,190) DO netsh interface ip add address "本地连接" 192.1 ...
- swift 中delegate的使用
今天写了delegate,遇到以下问题: 这里protocol的写法有问题,如果delegate指向一个实现了某个协议对象的引用,在oc里是这样写delegate的类型 id<protocol& ...
- native app
Apache Cordova是PhoneGap贡献给Apache后的开源项目,是从PhoneGap中抽出的核心代码,是驱动PhoneGap的核心引擎.你可以把他想象成类似于Webkit和Google ...
- python基础——递归函数
python基础——递归函数 递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用 ...