上一篇(WPF触控程序开发)介绍了几个比较不错的资源,比较基础。等到自己真正使用它们时,问题就来了,现把我遇到的几个问题罗列下,大家如有遇到其他问题或者有什么好的方法还望赐教。

  问题1.如何获取触控点的个数

  当你要在单指触屏和多指触屏时分别做不同的处理时就要用到。如何获取,刚开始我是弄个List,在TouchDown时存储输入点,然后TouchUp时移除输入点,这样我要判断输入点的个数时只要获取这个List的Count就行了,这是原始的做法,而且有的时候会不准(原因可能是down和up的事件抛出时机导致的,具体原因没作研究),有个比较简单的做法是在开头引用一下

using System.Linq ;

在ManipulationStarting或者ManipulationDelta里可以使用

int deviceCount = e.Manipulators.Count();

来获取即可。

  问题2.如何判断触控点是否位移

  这个问题也常遇到,情景是在单点抬起和单点移动再抬起做不同的处理,如单点抬起就弹窗,单点移动后抬起做翻页,如何判断呢?其实我上篇也略微提到了,就是定义一个TouchPoint类型的变量

TouchPoint touchPointOld;

在TouchDown的时候

touchPointOld  = e.GetTouchPoint(this);

然后在TouchUp的时候获取新点

TouchPoint touchPointNew = e.GetTouchPoint(this);

最后即可判断X轴的位移

double offsetX = touchPointNew.Bounds.Left - touchPointOld.Bounds.Left ;//判断X轴位移
  当然也可以判断Y轴的位移。在这里多说一句,当我们在用鼠标模拟触控测试时,是可以很精准地落下抬起,现实当中的手指落下抬起,虽然用户主观上没有动,实际上可能会有5个像素左右的位移(手指是肉团,没有鼠标那么精细),这时代码就要判定超过5个像素的移动才算手指位移了。
 
  问题3.如何做精准的翻页效果

  WPF的ScrollViewer已经支持触屏了,设置PanningMode属性即可滑动,但是这样滑动是利用了惯性,想要控制精准翻页比较困难。想做到像iphone相册那样的翻页效果,即不管使用多大力气,滑一次只翻一屏,这显然不适用。目前我能想到的是用动画来处理,大致思路是把罗列的对象放置于Canvas里(必须是Canvas,原因后面再说),然后使用DoubleAnimation作用于这个Canvas的TranslateTransform.XProperty,为避免生硬地滑动,可以设置DoubleAnimation的AccelerationRatio和DecelerationRatio,这样能有加速和减速的效果。每次手指放下记录点,抬起后判断位移趋势是左移还是右移,然后执行相应的动画,当然,每次滑动多少就要自己计算了。

  上面说到了一定要使用Canvas,当然你也可以用Gird、StackPanel等等、不过你会发现,只要执行移动动画,整个容器就会从你的视线消失。这可能与容器的特性有关,当你设置容器的宽度后(假设是水平滑动),执行动画,改变TranslateTransform.XProperty,容器好像不是按照你的原来意思来滑动,而是把初始化的时候显示的部分整体移动了,不管你设的宽度为多少,而Canvas则会像一张很长的画布一样慢慢展开。这个现象很容易重现,在blend里随意试一下,设置容器转换的X值(其实就是TranslateTransform.XProperty),你会很清晰得看到全过程。

  问题4.如何做图片的平移、缩放、旋转

  我认为这可以算触控开发的进阶了。因为这个涉及到操作一个原始的结构体——UI的Matrix。当然你想简单做做的话直接用Blend自带的TranslateZoomRotateBehavior就行,不过使用这个的话就相当于完全托管了,你能控制的东西很少。所以还是要直接操作Matrix。关于Matrix的介绍这里有个资源可以参考一下:WPF中的MatrixTransform

  不必研究很深入,你只需要知道Matrix有6个值,分别是M11,M12,M21,M22,OffsetX,OffsetY,其中M11和M22分别管的X轴和Y轴的缩放,OffsetX对应X轴位移,OffsetY对应Y轴位移,还有ScaleAt方法(缩放),Translate方法(平移),RotateAt方法(旋转),看他们的传入参数,基本都可以从e获取,如ScaleAt方法需要四个参数:

public void ScaleAt (double scaleX, double scaleY , double centerX , double centerY );

一般做平移、旋转、缩放的时候是写在ManipulationDelta里面,前面两个参数就可以从e的DeltaManipulation属性获得,为Scale.X和Scale.Y,后面两个参数就更简单了,是操作的中心点,也可以从e获得,ManipulationOrigin属性即为中心点,直接把他的X和Y传入就行。

  还要多说一句,这里的Matrix改变后,并不影响UI的Width或者ActualWidth,如果想要获取这类的值,需要计算。有这样的情景,我需要在缩放到某个尺寸后就不让继续缩放了,这时候你去获取UI的Width或者ActualWidth根本没用,因为这些值一直没变过。我的做法是定义全局变量,每次ManipulationDelta里改变的时候,就计算缩放后的新值,以此来记录当前缩放状态。其中ManipulationDelta的Scale.X就是X轴每次缩放的比例值。

  懂了这些,我认为已经算入门了。不过我也研究过iphone相册的效果,它好像不是我这样的思路。首先,它的滑动是实时跟随的,当然我也可以做到那样的效果;其次它的黑边处理,是等宽填充,即不管相片多宽多高,宽度是始终充满屏幕的,当你滑动时,不仅当前图片跟随移动,紧挨着的图片也会受影响,而我的只是处理当前的对象,并未去影响其他的。这也可能是操作系统的区别吧,IOS没研究过,说不定它是一个封好的控件,任何对象放进去就会有这样的效果。我看了新浪、QQ的IOS客户端,里面的图片展示都是这样的效果,看起来好容易。不过我相信,任何的效果都是代码实现的,看起来越简单,其实实现过程并不是那么简单。IOS对我来说只是一个黑盒,我能模仿,甚至超越。

WPF触控程序开发(二)——整理的一些问题的更多相关文章

  1. WPF触控程序开发(四)——MultiTouchVista_-_second_release_-_refresh_2的救赎

    起源 Multitouch是一款可用于Win7模拟触摸屏幕的开源软件(关于它的使用介绍),最后一次更新是在11年5月份,我是13年初开始用的,当时开发了一款类似IPhone相册的图片展示触控程序,就是 ...

  2. WPF触控程序开发(三)——类似IPhone相册的反弹效果

    用过IPhone的都知道,IPhone相册里,当图片放大到一定程度后,手指一放,会自动缩回,移动图片超出边框后手指一放,图片也会自动缩回,整个过程非常和谐.自然.精确,那么WPF能否做到呢,答案是肯定 ...

  3. WPF触控程序的开发(一)——有用的资源

    迟来的一篇博文,每次都要撞到月末,这个月实在太忙了,除了在公司上班,还接了个单子,用wpf做一个触屏软件,类似iphone的相册功能.先说搭建开发环境吧,我是不可能去买个平板来的,再说基于win7的程 ...

  4. Android开发实例之多点触控程序

    智能终端设备的多点触控操作为我们带来了种种炫酷体验,这也使得很多Android开发者都对多点触控程序的开发感兴趣.实际上多点触控程序的实现并不是那么遥不可及,而是比较容易.本文就主要通过一个实例具体讲 ...

  5. WPF触控方面的技术点

    一.基本的触控事件(原始触控) 二.复杂触控事件(操作)

  6. 微信小程序开发资源整理

    有兴趣学习微信小程序开发的可以关注简书专题 微信小程序开发 由于微信已经开发文档和开发工具了,所以下面的内容用处不大了. 具体参考:http://mp.weixin.qq.com/wiki/ 这篇文章 ...

  7. python flask框架学习(三)——豆瓣微信小程序案例(二)整理封装block,模板的继承

    我们所要实现的效果: 点击电影的更多,跳转到更多的电影页面:点击电视剧的更多,跳转到更多的电视剧页面. 三个页面的风格相同,可以设置一个模板,三个页面都继承这个模板 1.在指定模板之前,把css放在一 ...

  8. 记账本微信小程序开发二

    新建一个微信小程序项目 熟悉软件各种操作.

  9. 小程序开发二三事--数据请求head的设置

    wx.request(OBJECT) 发起请求的方法有很多,默认为 GET,有效值:OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT: 一般在 ...

随机推荐

  1. 浅谈C#解析网页

    最近做了一个项目,要求获取各大主流网页上的关键信息,本人以前了解过网页爬虫的知识,所以想到了网页爬虫了实现功能 第一次尝试: 采用webclient获取远程网页的内容,然后采用正则表达式进行过滤 但, ...

  2. 洛谷 P1807 最长路_NOI导刊2010提高(07)

    最长路 #include <iostream> #include <cstdio> #include <cstring> #include <queue> ...

  3. Log Structured Merge Trees(LSM) 算法

    十年前,谷歌发表了 “BigTable” 的论文,论文中很多很酷的方面之一就是它所使用的文件组织方式,这个方法更一般的名字叫 Log Structured-Merge Tree. LSM是当前被用在许 ...

  4. Vuforia切换回识别场景后黑屏解决

    使用Vuforia SDK开发时,如果从其他非识别场景切换回识别场景,可能会出现黑屏问题. 解决方法是在切换到其他场景时,先将当前场景的Tracker信息全部Stop.代码如下: IEnumerato ...

  5. 使用PowerShell 获取azure image publisher offer sku 信息

    使用azure powershell 获取指定区域的可用镜像 publisher offer sku信息 param ( [parameter(Mandatory = $false)] $Locati ...

  6. 【extjs6学习笔记】1.5 初始:关于布局

    absolute 绝对布局,这个布局使用 x 和 y 属性来指定组件的绝对定位 accordion 手风琴布局[可折叠布局]这个布局展示了在一个时间里只有一个内置的可支持折叠和展开的子级 panel ...

  7. Docker学习资料汇总

    一.Docker问答录(100问)  链接:https://blog.lab99.org/post/docker-2016-07-14-faq.html 二.Windows 10 如何安装Docker ...

  8. 数组Array和字符串String的indexOf方法,以及ES7(ES2016)中新增的Array.prototype.includes方法

    前言 我们在判断某一个字符是否存在于一个字符串中或者某一个值是否存在于一个数组中时,ES7之前我们需要使用indexOf,ES7引入了新的方法includes 语法 数组:Array.inexOf(s ...

  9. POJ Dollar Dayz 美元假日(完全背包,常规+大数)

    题意:给出整数n和k,n代表拥有的钱数量,k代表有k种工具,其价钱分别为1~k.求n元能有多少种购买的方案. 思路:k最大有100,数量过大,要用大数.其他的基本和完全背包一样. #include & ...

  10. Android(java)学习笔记120:BroadcastReceiver之 应用程序安装和卸载 的广播接收者

    国内的主流网络公司(比如网易.腾讯.百度等等),他们往往采用数据挖掘技术获取用户使用信息,从而采用靶向营销.比如电脑上,我们浏览网页的时候,往往会发现网页上会出现我们之前经常浏览内容的商业广告,这就是 ...