WPF触控程序开发(二)——整理的一些问题
上一篇(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轴位移
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轴每次缩放的比例值。
WPF触控程序开发(二)——整理的一些问题的更多相关文章
- WPF触控程序开发(四)——MultiTouchVista_-_second_release_-_refresh_2的救赎
起源 Multitouch是一款可用于Win7模拟触摸屏幕的开源软件(关于它的使用介绍),最后一次更新是在11年5月份,我是13年初开始用的,当时开发了一款类似IPhone相册的图片展示触控程序,就是 ...
- WPF触控程序开发(三)——类似IPhone相册的反弹效果
用过IPhone的都知道,IPhone相册里,当图片放大到一定程度后,手指一放,会自动缩回,移动图片超出边框后手指一放,图片也会自动缩回,整个过程非常和谐.自然.精确,那么WPF能否做到呢,答案是肯定 ...
- WPF触控程序的开发(一)——有用的资源
迟来的一篇博文,每次都要撞到月末,这个月实在太忙了,除了在公司上班,还接了个单子,用wpf做一个触屏软件,类似iphone的相册功能.先说搭建开发环境吧,我是不可能去买个平板来的,再说基于win7的程 ...
- Android开发实例之多点触控程序
智能终端设备的多点触控操作为我们带来了种种炫酷体验,这也使得很多Android开发者都对多点触控程序的开发感兴趣.实际上多点触控程序的实现并不是那么遥不可及,而是比较容易.本文就主要通过一个实例具体讲 ...
- WPF触控方面的技术点
一.基本的触控事件(原始触控) 二.复杂触控事件(操作)
- 微信小程序开发资源整理
有兴趣学习微信小程序开发的可以关注简书专题 微信小程序开发 由于微信已经开发文档和开发工具了,所以下面的内容用处不大了. 具体参考:http://mp.weixin.qq.com/wiki/ 这篇文章 ...
- python flask框架学习(三)——豆瓣微信小程序案例(二)整理封装block,模板的继承
我们所要实现的效果: 点击电影的更多,跳转到更多的电影页面:点击电视剧的更多,跳转到更多的电视剧页面. 三个页面的风格相同,可以设置一个模板,三个页面都继承这个模板 1.在指定模板之前,把css放在一 ...
- 记账本微信小程序开发二
新建一个微信小程序项目 熟悉软件各种操作.
- 小程序开发二三事--数据请求head的设置
wx.request(OBJECT) 发起请求的方法有很多,默认为 GET,有效值:OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT: 一般在 ...
随机推荐
- 使用gulp-uncss精简css,去除冗余代码
写html页面的时候,多修改几次就会出现很多无用的css代码,下面使用gulp-uncss来精简css文件,去掉没用的css代码 1.首先找个目录创建一个gulp项目在命令行输入:npm init ...
- Canvas基本绘画学习
学好Canvas,从简单开始.下面是一些Canvas入门最基本的实例分享: <!DOCTYPE html> <html> <head lang="en" ...
- UVA 1619 Feel Good 感觉不错 (扫描法)
Feel Good Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Bill is deve ...
- 八数码问题(一) 暴力BFS + STL
八数码问题是一个经典的人工智能问题.具体问题不累述了. 思路:由于存在多组测试数据,可以考虑“打表法“.所谓打表法,即枚举所有的初始情况,记录其到达终点的路径.而在这个题目中,顺序打表会调用很多次BF ...
- 棋盘问题——POJ1321
棋盘问题——深度优先搜索 题目描述: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘 ...
- CPP-基础:有关调用约定
在C语言中,假设咱们有这样的一个函数:int function(int a,int b) 调历时只有用result = function(1,2)的方法就能利用这个函数.然而,当高档语言被编译成计算机 ...
- tmpfs与内存盘
如何快速的吃掉一段内存:通过tmpfs来划一片领地,再用dd去粗暴占用mount -t tmpfs -o size=512M tmpfs /mnt/demodd if=/dev/zero of=/mn ...
- Python 生成器和协程
Python3 迭代器与生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访 ...
- PayPal为什么从Java迁移到Node.js 性能提高一倍 文件代码减少44%
大家都知道PayPal是另一家迁移到Node.js平台的大型公司,Jeff Harrell的这篇博文 Node.js at PayPal 解释了为什么从Java迁移出来的原因: 开发效率提高一倍(2 ...
- OC和C++的混用1
//Objective-C类 /*在混用之前需要做一步非常重要的事:不是代码而是编译器选项,在做混合编译之前一定要把编译器的Compile Sources As选项改为Objective C++. 修 ...