上一篇(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. FastDFS整合Nginx

    浏览器访问FastDFS存储的图片需要通过Nginx访问 需要安装fastdfs-nginx-module.Nginx 安装fastdfs-nginx-module模块 (1)将fastdfs-ngi ...

  2. 对flex-grow和flex-shrink的深入理解

    flex弹性布局,如果子元素宽度之和大于或者小于父元素宽度,空间就会存在剩余和不够,flex默认不换行,除非设置flex-wrap,那么这种情况下,有两个重要的属性,flex-grow和flex-sh ...

  3. 使用PM2搭建在线vue.js开发环境(以守护进程方式热启动)

    项目以vue.js+layUI的作为前端开发技术栈,需要有一个在线的环境供项目成员实时查看效果,总不能每次都webpack打包发布后才能看到效果吧!刚开始就简单使用npm run dev命令热启动,但 ...

  4. Nginx开启Gzip压缩提高页面加载速度

    本文转自http://www.veryhuo.com/a/view/51706.html,如有侵权,请及时联系转载人删除! 在实际运维中,为了提高web页面的访问加载速度,一般会把静态资源(比如js. ...

  5. LibreOJ #107. 维护全序集

    内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 上传者: 匿名   splay模板题 屠龙宝刀点击就送 #include <cstdio&g ...

  6. 卓越管理的实践技巧(2)成功的委派任务 Setup for Successful Delegation

    Setup for Successful Delegation 前文卓越管理的秘密(Behind Closed Doors)最后一部分提到了总结的13条卓越管理的实践技巧并列出了所有实践技巧名称的索引 ...

  7. mdns小结

    mdns的功能和普通DNS很类似,即提供主机名到IP地址的解析服务.   mdns一些基本特性: 1,mdns主要为小型私有网络(不存在DNS)提供名称解析. 2,mdns使用多播(Multicast ...

  8. 2018.4.16 Java多线程实现龟兔赛跑

    龟兔赛跑(通过多线程来实现 里面的具体方法) TT.java package com.lanqiao.demo3; /** * 乌龟 * @author Administrator * */ publ ...

  9. HTML5<aside>元素

    HTML5<aside>元素用来定义页面文档中主区域内容之外的内容,但之外的内容是与主区域内容相关的. 实例: <article> <h1>这个页面是我开始用htm ...

  10. Electron的介绍

    1.1 Electron是什么? 引用官网的一句话: Build cross platform desktop apps with JavaScript, HTML, and CSS 1.2 诞生 技 ...