现在最好的jquery手机触屏事件件库是哪个

如何挑选最好的触摸屏手套?
[摘要]由于天气寒冷,我们在户外基本上都会佩戴手套,而手机所采用的触摸屏无法在佩戴手套的情况下实现良好操作。
腾讯数码讯(编译:鹏飞)相信很多朋友都会有一个困扰,便是在冬天的户外无法很好地使用手机。由于天气寒冷,我们在户外基本上都会佩戴手套,而手机所采用的触摸屏无法在佩戴手套的情况下实现良好操作(即便手机拥有超敏感触摸屏,也很难在佩戴手套的情况下实现精确触控)。在这种情况下,选择触摸屏手套是唯一的解决方案,那么什么款式的触摸屏手套才是最好的?一起来看看几种主流设计的利弊。毛线织物类:最精确但不够耐用毛线类触摸屏手套是最常见的一种,价格也不贵,通常几十元就能买到,实现触控的方式主要是在指尖集成导电织物。相对来说,因为能够紧紧包裹住手掌,所以其精确操作性最好,但缺点包括容易起毛球、不够耐用、单层设计不过保暖等。在选择时,我们建议考虑一些价格更高、更有品质的款式,比如在毛线表面集成了蜂窝状的触摸点,不仅能够实现更好的操作,也更为保暖。皮革类:最美观但精确性差皮革类手套基本上是最为时尚的款式,并且相对更防风更保暖。它们的缺点也是较为明显的,便是会让手指粗壮很多,无法实现打字等精准的操作。也就是说,使用皮革触摸屏手套可以实现滑动解锁、拨号等操作,但要想发短信,最好还是通过语音助手或听写功能实现。多功能型:适合户外运动喜欢滑雪等冬季户外运动的朋友可以考虑多功能型触摸手套,这类手套通常体积比较庞大,采用高科技复合材质,能够实现良好的防风、保暖效果。但显然,其精确操作性并不出色。这时候,一些采用灵活设计的款式则更好用,比如采用双层设计的手指覆盖,内部为导电毛线、外部则是可套上或摘下的灵活覆盖层,同时实现运动和手机使用需求。来源:查报价,看新品,尽在腾讯数码官方微信 扫描左侧二维码即可添加腾讯数码官方微信您也可以在微信上搜索“腾讯数码”或“qqdigi”,获取更多数码资讯。
[责任编辑:yangzhao]
还能输入140字
Copyright & 1998 - 2017 Tencent. All Rights Reserved&&&中关村在线消息:触控屏已经从手机、平板逐渐延伸到、台式机上,那么触控屏究竟是不是比键盘鼠标更好用、更健康?我们怎么使用触控屏才能保护身体健康呢?国外的媒体对此进行了研究,并总结出一个解决方案。&&&&他们认为,多年来长时间使用桌面电脑而产生的肌腱炎、腕管综合症等病痛困扰着我们,但触控屏其实并没有解决这一问题。虽然微软已经将触摸操作加入到Windows&8系统中,但实际上屏幕并不支持触觉反馈,虽然拥有效果音,但实际上仍然需要花费相比传统键盘8倍的力量来进行打字输入。触控屏也不能避免常见“电脑病”(图片来自digitaltrends)&&&&一些专家认为,并非所有数码产品都适合使用触摸屏,尤其是。笔记本电脑的固有形态决定了它的操作体验,相对固定的屏幕和键盘位置符合人体工程学设计。但是使用触摸屏在操作形式上会带来很多对身体的潜在伤害。比如需要抬起胳膊触摸屏幕,使用了很多肩膀和躯干肌肉及手臂肌肉,是传统操作电脑的四倍;另外,这种操作形式也将影响你的坐姿。&&&&采用混合设计的平板/笔记本二合一产品要稍微好一些,因为用户有更多自由来决定它的使用形态。但尽管如此,还是建议配备一块蓝牙键盘。关节式臂架有利于触控屏操作(图片来自digitaltrends)&&&&目前最利于健康又十分高效的电脑操作形式就是:用户在家庭或是办公环境中为显示器安装关节式臂架,可以方便地调节屏幕的距离,不论是进行键盘输入还是触控操作都是十分便利的。另外,一个外接键盘对于笔记本或是混合本,都是非常有用的。&&&&如果使用触摸屏,用户需要保持一个良好的姿势来进行触摸操作,或者是在触摸屏、键盘和鼠标三种不同的操作中经常切换,尽量避免保持同一个姿势太久,都能在一定程度上环境疲劳。&&&&当然,如果未来类似于Siri或是Google&Now的系统能够准确地识别用户的每一句话每一个字,或许在一些私人环境内,我们就可以完全抛弃键盘进行语音输入了。
产品定位 屏幕尺寸
投诉欺诈商家:
天津重庆哈尔滨沈阳长春石家庄呼和浩特西安太原兰州乌鲁木齐成都昆明贵阳长沙武汉郑州济南青岛烟台合肥南京杭州东莞南宁南昌福州厦门深圳温州佛山宁波泉州惠州银川
本城市下暂无经销商君,已阅读到文档的结尾了呢~~
eView触摸屏常见问题库v(精品),eview触摸屏,eview触摸屏官网,eview触摸屏编程软件,eview触摸屏软件,eview触摸屏维修,eview触摸屏软件下载,eview触摸屏报价,eview触摸屏编程,触摸屏常见问题
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
eView触摸屏常见问题库v(精品)
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口触摸屏行业厂商资料信息|中国触摸屏网
会员常用功能
-------------
发布供求信息
我的供求列表
我的公司介绍
我的产品目录
我的留言箱
&& 厂商资料
优秀企业风采
找不到所属行业?
登记您的公司,让客户找到您!
最新公司推荐
众多知名企业加入了公司库
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
欢迎您登录中国触摸屏网发布您的公司和产品信息!
经营产品与描述
大屏幕灯泡,VOD,收银系统
LED护栏管,LED水底灯,LED彩虹管
品川双层ITO,品川单层ITO
二氧化硫试验箱,高温试验箱,精密干燥试验箱
恒温恒湿机,调温除湿机,转轮除湿机
湖南LED显示屏,湖南电子屏,LED显示屏
led显示屏,led广告显示屏,led全彩显示屏
旋片式真空泵,水环式真空泵,真空箱
铜箔铝箔胶带,导电布胶带,醋酸布胶带
餐饮软件,餐饮系统,POS系统
AD7873ARUZ,TSC2003IPW,触摸屏IC
LED大显示屏,LED室内全彩,LED室外全彩
触摸点歌台,KTV触摸点歌机,嵌入式触摸点歌台
ITO FILM ,光学胶,黑白胶
排队机,LED单元板,LED控制卡
&&& 网站广告、经销商加盟、触摸屏软件销售:028-- 联系人:张小姐 传真:028- 全国各地经销商如下:
电子邮件: 51touch( 请将地址中的"(A)"改成"@",避免垃圾邮件出此下策,望谅
版权所有 Copyright(C)
地址:成都市高升桥东路2号高盛中心1109室 电话:028--&
在线咨询QQ:&
MSN 帐号:touch8( 将"(A)"改成"@"即可查看: 28855|回复: 96
Windows7多点触摸屏编程详解以及开发库集合下载
Windows7触摸编程详解和开发库集合
开发环境:Windows7 + Vs2008 + .Net Framework 3.5
本地下载:/ q# K- x2 |' i4 x2 c% z, k
C#代码: " ~: j5 X0 |6 F/ j7 a
6 z" S. |/ ~; }8 j2 f- Y
(393.79 KB, 下载次数: 315)
10:11 上传
点击文件名下载附件
下载积分: 金币 -2 个
; P. U) ]# m0 q3 \4 J. `
(2.36 MB, 下载次数: 291)
10:12 上传
点击文件名下载附件
下载积分: 金币 -2 个
; m# B&&t3 ]: ~4 q9 a
/ {. I+ b- v&&O* o
1 W3 r5 O. X) U& S, T4 u, U
) a" E&&B+ B3 W/ {( G
C++代码&&?* \, s' l& G&&s
' A6 U/ p9 L/ T0 H! u& `
2张关于windows7多点触摸的效果图:
: {$ x/ ?. N3 U. G- ^$ H0 Y+ V
. E7 i- S4 @. Y
1.jpg (16.24 KB, 下载次数: 117)
09:53 上传
使用多点触摸技术,在屏幕上画图& & 看样子适合画抽象画....
* P9 F/ B$ Q" A: e6 j
2.jpg (13.53 KB, 下载次数: 123)
09:53 上传
: O$ q! f4 Q& K, F
在地图上寻找会场附近的咖啡店
概述 + K( f$ O4 {) O; X$ u
8 i5 V- Y9 ]% p& i- L
2 H- e2 _, M5 x. [
Windows 7 使用户无需使用中间设备,通过手指触摸方式就能够管理应用程序。这扩展了平板电脑基于触笔的功能。与其他指点设备不同,这种新功能支持在不同指点位置上同时发生多个输入事件,支持复杂的场景,比如通过十指或由多个并行用户管理应用程序。然而,要成功实现此功能,我们必须调整应用程序的用户界面和行为,以支持这种新的输入模式。
本文目标是将一个基于鼠标的简单图片操作应用程序升级为支持多点触摸的现代应用程序,类似于 Microsoft Surface 行为。
3.jpg (23.67 KB, 下载次数: 117)
09:55 上传
图 1* B) a( a! \6 F! C9 N
6 T) c* ]$ K4 N. B; n
&&N! K/ t- Q; f) z
启用了多点触摸的应用程序
目标 : S( l" g% N! G3 F
0 q! M( q&&k% g/ C
本动手实验将学习如何管理多点触摸事件,包括:
. B4 x' B4 P% J% ~2 [* i
•& && && && && &理解同时操作多个对象的含义& &
•& && && && && &检查多点触摸硬件是否存在及其就绪情况 : O$ d. c3 P1 ^( d. r5 @* E
•& && && && && &在 WPF 3.5SP1 中实现多点触摸事件! e+ z- u8 N6 {( w
•& && && && && &通过内置的 WPF 触笔事件使用多点触摸事件&&S6 Z& E4 \$ a1 a3 R4 y" o7 r5 l/ |
/ d% O; _: v! |+ O; N
•& && && && && &使用操作 (Manipulation) 和惯性 (Inertia) 处理器' r2 \- s/ q: g) l4 c* j
' P) Y# A3 |# i
& && && && && &
8 D& W3 i4 N/ b0 ^/ I$ ^&&Y) y" [; U# W. i
设置 0 }0 U& `8 E+ ]5 z4 E
& i2 Q% y( N9 k, v& R% Q
7 H% L4 }; Z* a&&f
为了方便起见,我们以 Visual Studio 代码片段的形式提供将在本动手实验中使用的许多代码。本实验所需的设置包括安装这些代码片段。为此:
* B7 n" {8 @* h* q. P" v" F
1.& && && && &运行位于本实验的 Setup 文件夹下的 MultiTouchLab.vsi 安装程序。
2.& && && && &按照向导说明安装代码片段。
: [* H* a5 P" S
& && && && && & $ R$ D7 |' B7 N" T/ F+ r
系统要求 9 v* a7 R. O1 R# t
2 d/ x7 m" ~3 i" P" n
% a' W&&r3 ?# a3 B, ?9 ^) y&&l
要完成本实验,必须拥有以下工具:
0 P$ o) ^$ }+ _5 v&&~. \* k
•& && && && && &Microsoft Visual Studio 2008 SP1
&&n0 I; j. k) @9 D6 m
•& && && && && &Windows 7; z9 k8 D- q# J
•& && && && && &Windows 7 Integration Library 示例(Windows Touch:开发人员资源)
•& && && && && &一台多点触摸硬件设备
& && && && && &
$ c1 L+ ^# n- p/ m- l
练习 1 :开发多点触摸图片处理应用程序 4 E# p+ W/ _$ s2 K
) D. B4 ?( G1 ]/ g6 R' Q
: N7 Q" n' J6 ^( R( [
要理解如何管理多点触摸输入,我们首先需要理解如何处理(基于鼠标的)单点输入。为此,我们准备了一个基于鼠标的图片处理应用程序,就是多点触摸动手实验初始应用程序。
任务 1 – 了解解决方案 " {3 ?0 }( G" _, f9 b% o( ]
1.& && && && &打开位于 %TrainingKitInstallDir%\MultiTouch\Ex1-PictureHandling\Begin 下的初始解决方案,选择想要使用的语言(C# 或 VB)。
: L6 ]/ h, m8 o3 O% S. Q0 L# @
2.& && && && &编译并运行它。可以进行的操作有:通过单击挑选一张图片;按住鼠标左键并移动鼠标来拖动图片;使用鼠标滚轮缩放图片。每次选择一张图片时,该图片就会出现在最前面。在开始编码之前,首先了解一下初始应用程序。&&E6 U&&{6 |6 U/ h
7 O( ]% Y: P( b" x" X1 u! C
该应用程序用于处理图片。每张图片由一个 Picture 用户控件表示。这是一个非常简单的控件,它基于 WPF。Picture 用户控件的 XAML 如下:8 \8 E( A8 y) C&&X7 [
* t& e# g1 V" u4 q- L( Q
XAML/ L! Y2 {1 S0 j2 x& d. e$ a
&UserControl x:Class=&MultitouchHOL.Picture&1 {$ u, ?% v, |
" Y1 n7 }2 [! a+ e* q) J+ R7 Y
& & xmlns=&/winfx/2006/xaml/presentation&
& & xmlns:x=&/winfx/2006/xaml&&
& & &Image Source=&{Binding Path=ImagePath}& Stretch=&Fill& Width=&Auto&
& && && &&&Height=&Auto&&&RenderTransformOrigin=&0.5, 0.5&&&&j$ s# k4 C; O/ Y4 m) U6 ]
* c" }: w9 x$ P5 ^/ s
& && &&&&Image.RenderTransform&+ Y- _3 C. r0 u
& && && && &&TransformGroup&
: l5 Q. W9 p* q
& && && && && & &RotateTransform Angle=&{Binding Path=Angle}&&&/RotateTransform&$ E# A. F3 k" i
& && && && && & &ScaleTransform ScaleX=&{Binding Path=ScaleX}&
& && && && && && && && && && && && &ScaleY=&{Binding Path=ScaleY}&&0 @- _- U: A: l: T' P8 o9 ?
& && && && && & &/ScaleTransform&! J0 G3 n3 T$ t$ R/ O5 g# c
& && && && && & &TranslateTransform X=&{Binding Path=X}& Y=&{Binding Path=Y}&/&; c0 m& l. M. X6 @( Y2 |* I7 u
, f% k) u& H&&M# F
& && && && &&/TransformGroup&
& && &&&&/Image.RenderTransform&. `" i# D/ r8 h5 Z7 n9 A
, @0 g: Y9 {' v3 ?; f4 ?* Z- @
& & &/Image&
: f3 _0 b&&X4 a3 ^. N$ O9 r
&/UserControl& # K( x3 M. h. m) a3 V1 o
注意: 此用户控件的代码仅包括 ImagePath、Angle、ScaleX、ScaleY、X 和 Y 依赖属性的声明。ImagePath 是有效的图像文件或资源的路径。Angle 是图像的旋转角度。ScaleX 和 ScaleY 是图像的缩放系数,而 X、Y 是图像的中心位置。$ [& K&&i' ~0 z4 [: `: ]
/ D2 Z+ @: a0 Y! f0 l8 _
( R/ k! i$ f- @5 @. K
3.& && && && &现在看一下 MainWindow 类。此 XAML 文件声明 MainWindow:6 c" D; u3 n+ a# _0 z
6 u. C& Z8 w4 e&&_! }) p+ _' b
&Window x:Class=&MultitouchHOL.MainWindow&3 {&&J# J& y9 |1 q
& & xmlns=&/winfx/2006/xaml/presentation&! e& S% Z8 x3 Y+ X
3 y0 v* l( g# ~+ B$ x
& & xmlns:x=&/winfx/2006/xaml&
& & Title=&MultitouchHOL& Height=&300& Width=&300& WindowState=&Maximized&
& & xmlns:mt=&clr-namespace:MultitouchHOL&&6 _8 E+ B# S* D* P5 ?3 M* I+ }/ h
& & &Canvas Name=&_canvas&&( w4 N&&h0 N7 o. B
& & &/Canvas&7 a. |# l3 {( b" c7 ^- C' x
. B1 _: b/ J&&[$ Z&&X2 r4 h" F&&O4 t
&/Window&% R9 N. G8 W! ]" l
8 s+ i" O- o5 g" b! T6 ~0 z3 y7 L$ y
0 W' E# R2 Q6 [6 V) A&&g
注意:此窗口仅包含一个画布元素 (_canvas)。画布是包含 Picture 用户控件实例的面板。
4.& && && && &现在打开 MainWindow.xaml.cs (C#) 或 MainWindow.xaml.vb 文件 (Visual Basic)。如果用户按住鼠标左键,_picture 成员将拥有当前跟踪的图片;否则,它将拥有空值。_prevLocation 是 Mouse Move 事件报告的上一个位置,用于计算偏移量。) Z# n: _/ j- o: ~; k6 f( o. ?
5.& && && && &MainWindow 构造函数创建主窗口,注册各种事件处理函数。
8 h. s9 k( m) S. @4 |
C#, s* Y3 R3 O&&Q; Z( N0 n
public MainWindow()* l1 S, C/ ?7 S0 {
& &&&InitializeComponent();
3 [- K+ D# f&&B4 c) Q! a9 s
0 N4 I/ y5 c- l/ D1 C
& &&&//Enable stylus events and load pictures
9 Y& |8 `; I3 A" \% Z. ]
& &&&this.Loaded += (s, e) =& { LoadPictures(); };6 a9 B: k" D/ K9 U5 [. w! U) S
5 ]8 c& M) o0 F/ Y
8 X/ n( e7 X3 n7 b
& &&&//Register for mouse events- O4 a: o&&[; Z
5 F- h' h: W- F! N
& &&&MouseLeftButtonDown += ProcessD6 N: M' n& H9 I, y
+ u) N( p: _&&_% F
& &&&MouseMove += ProcessM
& &&&MouseLeftButtonUp += ProcessUp;
, s% s2 l2 o6 K
& &&&MouseWheel += ProcessMouseW+ r6 B1 Y* M- s$ U4 }1 S
/ N* J& @- O7 B* R; L2 T
) g& C7 I! _7 _& H) G$ W/ ^/ g- h2 [
Visual Basic3 \) G! P4 ]9 n$ O/ z: G3 q/ K& k
! g/ ^7 G5 U' G2 P
Public Sub New()
: }4 F&&g+ t2 b* l3 d
& & InitializeComponent()
End Sub# A# ?3 L1 l7 J) l: @7 y& }: c3 _
4 a% \&&O. D. o5 W+ f. v
2 G4 i/ d+ a3 x1 [/ D+ _
注意: 在 Visual Basic 中,事件处理注册在事件处理程序声明中定义,使用 Handles 关键字。. L&&P- g* B7 g$ A
1 r$ {2 W- C; G+ g7 S
6.& && && && &LoadPictures() 函数从用户的图片文件夹加载图片,并为所有图片创建一个 Picture 控件。它只在初始化画布之后才执行此操作。下面看一下 LoadPictures() 代码。: g, |) s& @' T&&j( F" ^
7.& && && && &现在看一下如何处理鼠标事件。
C#4 E3 d! k8 v7 @* w3 e
' V3 w7 \, i: e- @
private void ProcessDown(object sender, MouseButtonEventArgs args)
* @/ t3 e9 W&&j- d0 c2 L- x+ Q% z$ c
{" {- n! c& X2 g&&t# H3 G- g( g) j% d
/ V2 _4 L6 x# O8 G&&V) J
& &&&_prevLocation = args.GetPosition(_canvas);
& &&&_picture = FindPicture(_prevMouseLocation);% r" A- z& U( ]) |6 |
& &&&BringPictureToFront(_picture);. t9 t$ V/ [5 M( d( [
; I" O/ m# J' O9 p* J8 T# z9 c
}) b5 i# b8 b2 f! h/ o" G/ y
Visual Basic
3 Y( }) d- o, s1 p- l
Private Sub ProcessDown(ByVal sender As Object, ByVal args As MouseButtonEventArgs) Handles Me.MouseLeftButtonDown2 L% ?. n4 Y4 c3 K' T&&a8 q+ V
& & _prevLocation = args.GetPosition(_canvas)3 M- e& C* h- ?8 K! b' Q
% d0 ^1 g4 [/ x- b
& & _picture = FindPicture(_prevLocation)/ ^) y4 X2 a7 ?& x3 o
& & BringPictureToFront(_picture)
- @5 I: V5 k1 Q* N&&b! h
; {! y3 G/ G% k- L) T/ T9 g
按下鼠标左键将启动一个新的图片拖动会话。首先我们必须获得相对于画布的指针位置。我们将此信息保存在 _prevLocation 数据成员中。
8.& && && && &下一步是在该位置找到一张图片。FindPicture() 函数利用 WPF VisualTree 点击测试功能来找到最顶层的图片。如果鼠标所在位置没有图片,则返回空值。& C5 s0 ~+ e/ ]&&D2 X8 [
9.& && && && &BringPictureToFront() 将所选图片的 Z 轴次序设置在其他图片的最顶层。$ K/ Z) d. j) w* G6 w* B: c
$ k2 O7 x$ t3 H- d% s
此处理程序的处理结果是 _picture 数据成员“记住”了所选的图片,_prevLocation 获取鼠标位置的代码片段。我们看一下当鼠标移动时会发生什么情况:: V1 n- r4 t' Y9 o
) \8 Z$ `( B4 X" ^) T. e) q
private void ProcessMove(object sender, MouseEventArgs args)& G" c' Y% z. V. a, j0 C# N7 l4 t
$ l6 K/ W0 q# g, U
{# W9 k! Q, A: c0 x- l9 P9 G0 V4 j
3 x+ X- u* N+ \# E3 g2 ]. w7 u$ w
& &&&if (args.LeftButton == MouseButtonState.Released || _picture == null)
4 [: I' \&&}, l& |
& && && &0 M&&U% N: y# z: }! Z0 B
3 D" R9 {' I& P2 H- g
& &&&Point newLocation = args.GetPosition(_canvas);
& &&&_picture.X += newLocation.X - _prevMouseLocation.X;3 B; r8 D6 V" k* E$ C8 W6 u# v+ A9 K
( I, F0 I- [* N&&X1 k) S&&m
& &&&_picture.Y += newLocation.Y - _prevMouseLocation.Y;) U+ e$ f1 O: b( S5 F( S
* C! B6 m9 x9 q0 [; V
& &&&_prevLocation = newL
}1 b2 t&&[6 x&&u8 T, I! N
& L% d. x! E% U
Visual Basic0 a4 s: B3 _( y
Private Sub ProcessMove(ByVal sender As Object, ByVal args As MouseEventArgs) Handles Me.MouseMove
% J/ K% \3 k4 a8 O+ V
& & If args.LeftButton = MouseButtonState.Released OrElse _picture Is Nothing Then Return
. {' A8 S* R: G
& & Dim newLocation = args.GetPosition(_canvas): ^6 H! t2 K" f* ?. v$ N# f
- e' P1 J# T& [* V% @& Y( _( @
& & _picture.X += newLocation.X - _prevLocation.X! r# U3 u% t% y9 Y. E
& & _picture.Y += newLocation.Y - _prevLocation.Y
& & _prevLocation = newLocation
% l- ^& [( R* _3 n: C
End Sub+ {1 k% l# q5 j- F' l9 I
4 J8 [' \4 D4 h1 o- O
如果用户未按下鼠标左键或者未选择任何图片,该函数将不执行任何操作。否则,该函数将计算平移量并更新图片的 X 和 Y 属性。它还将更新 _prevLocation。
10.& && && & 我们需要注意的最后一个函数是 ProcessMouseWheel:
; b- s* m- N( u( E7 o4 q
C#) `- o2 r* x9 d2 Z1 _' \
private void ProcessMouseWheel(object sender, MouseWheelEventArgs args)' j& Z&&T* ]- h1 z( ]
( I: f1 J& g7 C
$ z. _+ T) R6 {; G! A
& & Point location = args.GetPosition(_canvas);8 G. _# m&&k: Q
! ?: I2 d1 H9 T% s0 i' x& f7 J# L
& & Picture picture = FindPicture(location);7 Y& d&&A, u8 G9 i# n( K: }# \; M
& & if (picture == null)
& & BringPictureToFront(picture);
, Z9 F: F: A$ t$ _; `, W+ K
& & double scalingFactor = 1 + args.Delta / 1000.0;
& & picture.ScaleX *= scalingF
1 `- a/ F, Y3 j5 q: S7 ~6 w( H
& & picture.ScaleY *= scalingF
' l3 G% X" x' R" R2 V! x4 x
Visual Basic: R7 U0 p% `5 h* X6 j8 C- A- J5 S
Private Sub ProcessMouseWheel(ByVal sender As Object, ByVal args As MouseWheelEventArgs) Handles Me.MouseWheel
& & Dim location = args.GetPosition(_canvas)
& & Dim picture = FindPicture(location)
& & If picture Is Nothing Then Return! u9 A& e3 ~* ?+ n0 d: ]& A; O% r- J
! s+ M$ n&&T5 @' s( E; P% u" M
2 q! S- p4 v4 P: p0 \, J
& & BringPictureToFront(picture)
0 |" _) p8 y$ ?" K) [! `' ]
& & Dim scalingFactor = 1 + args.Delta / 1000.0
& & picture.ScaleX *= scalingFactor5 V+ O7 n&&Z; L' `- U3 J6 ^" P# `
& & picture.ScaleY *= scalingFactor4 E$ O& I+ K, j6 ?
) h9 k1 W2 Y4 I
End Sub7 Y! x* O( c" v% l
6 @: i4 K- _" H1 K
此函数获取鼠标指针位置,找到该位置下的图片,将其呈现在最前面。然后它从鼠标滚轮偏移量中得到偏移系数。最后只需更新图片缩放比例。 + M+ u0 n/ K7 Q2 T% r
" `+ j/ X$ R2 r% f9 F
& && && && && &
任务 2 – 测试多点触摸硬件是否存在及其就绪情况
在本任务中,我们将开始编写多点触摸程序。尽管 WPF 3.5 不支持多点触摸(多点触摸事件和控件将包含在 WPF 4.0 中),但可以通过某种方式来在当前版本中使用多点触摸。为此,我们必须使用 Windows 7 Integration Library 示例。此集成库是一个示例,演示了如何在 .NET 代码中使用 Win32 本机 API。&&A/ f. h# s5 }& B0 G
注意: 可以从网址 &&获取 Windows 7 Integration Library 示例。为了简单起见,这些库在 %TrainingKitInstallDir%\MultiTouch\Assets\Win7LibSample 下以实验资源的形式提供,请选择您想要使用的语言(C# 或 VB)。
' p3 n% w5 E7 K0 s3 P
0 _9 n: k" H& b% B; i: D2 j9 H7 G
1.& && && && &添加对 Windows7.Multitouch.dll 和 Windows7.Multitouch.WPF.dll 的引用。
2.& && && && &将以下代码添加到 MainWindow 构造函数中:
(代码片段 – MultiTouch – IsMultiTouchReady CSharp)% Z+ ?' h2 a0 x
+ Z' O" m. d5 Y8 B
if (!Windows7.Multitouch.TouchHandler.DigitizerCapabilities.IsMultiTouchReady)/ A. j1 M" c, r&&g! E# t
{) \( v) ?2 |, ?* o: W7 F) T
2 X! }/ y6 V! n2 |&&X
& & MessageBox.Show(&Multitouch is not availible&);
& & Environment.Exit(1);
: a7 b7 b. a1 q, L" J( o, o
(代码片段 – MultiTouch – IsMultiTouchReady VB)
Visual Basic) ]# E+ E& o% M( h
# E0 a$ ~6 `( s/ }2 m, O' _
If Not Windows7.Multitouch.TouchHandler.DigitizerCapabilities.IsMultiTouchReady Then
' ?) I/ O3 U& S+ ~
& & MsgBox(&Multitouch is not availible&)
, @0 S- ^9 s/ w- u0 G- ]' x7 I/ }8 |$ M# O
& & Environment.Exit(1)3 \3 R$ r' t# v0 C1 k
End If# H' o* S, Q4 f& @; Z; R- `% ^
# l6 t* }" `' R6 `0 D7 X
( F&&g&&v6 p3 t1 O& a. \
3.& && && && &查看 TouchHandler.DigitizerCapabilities 的其他属性。5 b6 p0 W+ Y+ ]3 s5 k, A2 e
0 P( [- v% P% K+ g
1.png (3.1 KB, 下载次数: 121)
10:02 上传
; i, Y# v&&w0 @& D, N
查看 TouchHandler.DigitizerCapabilities 属性
任务 3 – 将鼠标事件替换为触摸事件 &&' X( x& U&&\" `: s
3 f2 O% M- B3 @3 j
$ N+ c9 p: K. x$ }
在本练习中,我们将删除鼠标事件并将其替换为触摸事件,以便使用我们的手指处理图片。 + m. f8 _% z! }* H/ C
( C+ y# u0 U7 s6 x5 o: O
1.& && && && &将以下代码行添加到 MainWindow.xaml.cs 文件 (C#) 或 MainWindow.xaml.vb 文件 (Visual Basic) 开头:
& o, L&&k, R2 k: K. M
. r* A$ R! ?% _% v+ P- Y
using Windows7.M
using Windows7.Multitouch.WPF;
Visual Basic
' ~' T&&W, d# f9 @9 [/ d: S
Imports Windows7.Multitouch
0 L( j4 J& d, d$ T" O
Imports Windows7.Multitouch.WPF0 V% ~6 S. r& `( D" A: y
2.& && && && &我们想要在 WPF 3.5 SP1 中实现多点触摸事件。为此,必须告诉系统以触笔事件的形式发出触摸事件。Windows 7 Integration Library 的 WPF Factory 类拥有一个函数来实现此功能,那就是 EnableStylusEvent。在 MainWindow Loaded 事件处理程序中添加对此函数的调用:
C#3 o5 t6 @. P, [3 h# e
4 Q0 Q+ r! b* O/ r
public MainWindow()! V2 |4 L& K; ?' y1 i1 B
{" F7 Q5 }8 a8 J) ^
& & ...# c0 o5 `, `: L) L
7 s) D* {" o* y
& & //Enable stylus events and load pictures5 s, f' q& J& w$ p. S8 z: V
2 h# t9 F3 b8 H$ J
& & this.Loaded += (s, e) =& { Factory.EnableStylusEvents(this); LoadPictures(); };
Visual Basic, F, f& x2 j5 ~
Private Sub Window_OnLoaded() Handles Me.Loaded* M&&T% P8 K% \. n/ q3 |5 I
& & Factory.EnableStylusEvents(Me)1 k8 J' A% X- d
& & LoadPictures()
& s: O' L: u: X&&I
3.& && && && &删除 ProcessMouseWheel 事件处理程序及相应的事件注册(我们将在稍后处理缩放)。" H; j$ d. O6 W* ^
$ A+ q8 C, B&&L' U7 S! G
4.& && && && &(仅适用于 C# 用户)删除 MouseLeftButtonDown、MouseMove 和 MouseLeftButtonUp 的事件注册代码。MainWindow 构造函数应该类似于以下代码:
9 ?9 m8 }6 B# Y2 d' i
" N. `/ b8 H( f1 ]1 g* f8 S4 M
public MainWindow()" W$ U4 d7 R, P6 ^
{) D" t7 }# A" X$ U2 L8 X/ V
& & InitializeComponent();# d/ S, k% r" ^9 i4 h
2 z* L0 W9 Q. q. f
& & if (!Windows7.Multitouch.TouchHandler.DigitizerCapabilities.IsMultiTouchReady)" m* c1 ?' @. n) g! O5 ?) F4 g
/ H0 N! M0 ]1 s
& & {4 O' @5 z&&k. q4 _
5 @( i$ [# P1 U7 U0 m
& && &&&MessageBox.Show(&Multitouch is not availible&);
; [8 |" I& t. K
& && &&&Environment.Exit(1);6 a. [0 [0 g4 P) n& k7 E. x
& & }( L&&p3 T9 i4 v% D
& & this.Loaded += (s, e) =& { Factory.EnableStylusEvents(this); LoadPictures(); };
$ p4 A+ Y0 ?0 e+ o8 y, K
5.& && && && &更改以下事件处理程序的签名和代码:2 ?' ?, \: q5 ^. f/ ^* s$ }
注意:此事件处理程序的签名已经更改。我们使用StylusEventArgs 代替与鼠标相关的事件参数。
(代码片段 – MultiTouch – StylusEventHandlers CSharp)' D- h$ [2 C8 U) ^6 ~: T7 h3 n: M& b
- t* g/ f6 Z+ y1 i5 A5 }
0 n2 s6 S. y&&O4 T
public void ProcessDown(object sender, StylusEventArgs args)' C' m# O" i0 L+ {, {0 T
) \( x# l9 S" W6 a- a7 W# k3 q2 A
& & _prevLocation = args.GetPosition(_canvas);$ U; x# I% e2 E) v&&U! L7 B7 _
& & _picture = FindPicture(_prevLocation);
5 c3 w, g&&G2 X, |* n% [: _( h
& & BringPictureToFront(_picture);3 U; G6 w6 `! `7 I/ Q
}5 Z4 C! G5 Q, [) \
9 o. S% {$ S- P: K: N
public void ProcessMove(object sender, StylusEventArgs args)6 S- O/ e, J/ H/ G/ g
) G( s' [, R# `5 V9 C
& & if (_picture == null)
! w0 D. {# @( x( R
& & Point newLocation = args.GetPosition(_canvas);# `4 [5 A4 Z- T4 U5 C
& & _picture.X += newLocation.X - _prevLocation.X;7 s3 A7 [! G, \2 ^( w, H
, Z+ Y5 \0 X. D2 |2 U% h
& & _picture.Y += newLocation.Y - _prevLocation.Y;
& @: X+ }; W* B5 G) ^9 h
& & _prevLocation = newL
}$ a/ N! ~$ E* e. _( K1 t
% F5 D4 u&&G; I3 P
public void ProcessUp(object sender, StylusEventArgs args)
1 H7 A: }2 b&&I' _& _
& & _picture =
1 B% X# y. f$ c, J7 U6 j% j
}+ V. c! V, y6 J8 S& U
(代码片段 – MultiTouch – StylusEventHandlers VB)&&Q! ?% i5 k$ L2 e
/ m&&}&&e; e: K! p+ Q3 `5 h
Visual Basic
6 Q4 w# B+ ~8 ?% c# Y
Public Sub ProcessDown(ByVal sender As Object, ByVal args As StylusEventArgs)$ O9 k* h9 m, l# A" I# ]$ u
& & _prevLocation = args.GetPosition(_canvas)
& & _picture = FindPicture(_prevLocation)
& & BringPictureToFront(_picture); ~. ]7 ~/ u/ E5 C: b! S
: h" ~/ j7 {&&X" f: M* n6 t
6 ~5 {9 u/ q8 a6 b! v/ y, ~' ?+ s
Public Sub ProcessMove(ByVal sender As Object, ByVal args As StylusEventArgs)
& & If _picture Is Nothing Then Return( `1 _0 \6 F. B' Z&&J3 a6 }
. `/ {6 z$ r' B) G$ G. \! V
& & Dim newLocation = args.GetPosition(_canvas)5 x) P2 }8 {8 s2 d. ]1 u
7 ]' [: m# E5 G&&I
& & _picture.X += newLocation.X - _prevLocation.X' N0 C* W2 x& C6 W9 H
& & _picture.Y += newLocation.Y - _prevLocation.Y6 X; K9 K# W1 _# m8 W
& & _prevLocation = newLocation: k2 o) z) f1 ^% X&&z
" g5 W; e- i* q9 [5 M) i2 D7 u- X* A9 Z&&c
$ X, X- A: g8 i2 B1 F
Public Sub ProcessUp(ByVal sender As Object, ByVal args As StylusEventArgs)" U9 Q0 w5 k- S
& & _picture = Nothing
6.& && && && &注册触笔事件。; c$ p1 @$ y7 }2 X. y
/ R% m2 O5 `# A7 d. N# h" D; n$ F4 o
C#; ^! E% S5 @1 Z
; k/ {+ U$ `# C5 Q3 w
public MainWindow()
5 Z0 Y, V0 a3 T: e7 x1 O
; [+ D# I" W) O&&a5 E
& & //Register for stylus (touch) events
& & StylusDown += ProcessD( c% J9 j" n&&{8 s: {6 v' g
& & StylusUp += ProcessUp;6 M6 O! L7 P4 S% K
& & StylusMove += ProcessM2 @&&S4 [( G/ g: Y; h# r
0 a4 k7 ~" P9 c% v2 |( }/ ^
Visual Basic
9 j( L7 G1 _6 C1 m
Public Sub ProcessDown(ByVal sender As Object, ByVal args As StylusEventArgs) Handles Me.StylusDown
Public Sub ProcessMove(ByVal sender As Object, ByVal args As StylusEventArgs) Handles Me.StylusMove0 d&&s9 |. H8 h% Z. J/ Z
4 D& m4 O& y, |1 w
End Sub& ?5 x) B! E1 E- s
/ |1 r9 H6 M9 `- l% [& q5 K
Public Sub ProcessUp(ByVal sender As Object, ByVal args As StylusEventArgs) Handles Me.StylusUp. P3 N& o4 }9 v9 T0 `" Q7 d/ E
End Sub* f% L% `9 Q&&g$ E
! C8 N7 ]( C# F- G# Q: i
7 ]: X" B3 V) ^* c
7.& && && && &编译并运行。使用手指代替鼠标!
注意: 如果尝试使用多个手指会发生什么情况?为什么? 8 ]1 I&&J" F- M8 @
: I9 d0 s. q, m! O8 ]: ~: r" u
任务 4 – 同时处理多张图片
# ?0 D* L5 U5 S9 y6 h" s
在本任务中,我们将添加多点触摸支持。触摸屏幕的每个手指都会获得一个唯一的触摸 ID。只要这根手指继续触摸屏幕,系统就会将相同的触摸 ID 与该手指关联。当手指离开屏幕表面时,该触摸 ID 将被系统释放并可被硬件再次使用。在我们的示例中,当一根手指触摸图片时,应该将该手指的唯一触摸 ID 与该图片关联,直到该手指离开屏幕。如果两个或更多手指同时触摸屏幕,那么每个手指都可以操作相关的图片。
当使用 Stylus 事件作为触摸事件时,可以从 Stylus 事件参数中提取出触摸 ID:
# W, ~1 i- l# I& O& `( h
C# | Visual Basic
args.StylusDevice.Id
7 O' _&&L6 j: Y/ `
WPF 将使用相关的 StylusDevice.Id(触摸 ID)不断为每个触摸屏幕的手指触发事件。
6 C/ w+ i* D* x# U4 B- E
'更多.net源码和教程,来自[乐博网 ]5 o% f1 k/ Y% v1 ?
1.& && && && &我们需要同时跟踪多张图片。对于每张图片,触摸 ID、上一个位置与图片用户控件之间必须保持关联。我们将首先添加一个新的 PictureTracker 类:
注意:PictureTracker 类也在 %TrainingKitInstallDir%\MultiTouch\Assets\PictureHandling下以实验资源的形式提供,请选择您想要使用的语言(C# 或 VB)。
(代码片段 – MultiTouch – PictureTrackerClass CSharp)
+ t" c2 n0 C5 S# R5 X
/// &summary&. X: N& ]% O* [1 U0 X7 q
/// Track a single picture
/// &/summary&
class PictureTracker' u6 M" @9 m( f
1 }% p' [6 ^& Z; q$ G, ?
& && & private Point _prevL. E; h* M. R4 x+ Q1 L3 r. @
& && & public Picture Picture { }& _/ e( V' f- m% V6 ]% ^
& && & public void ProcessDown(Point location)
! q- h% g$ G: W! H' i&&y
& && & {5 \&&z; V7 T' t8 M) J# _
/ G, W3 Z: f& P) k' J
& && && &&&_prevLocation =
0 }& P# O& S% }9 G- e! h4 d: n
- W( N% |: g5 l8 [5 D) |
& && & public void ProcessMove(Point location)
- j! |1 ^" ]1 V2 X" Q
& && & {( t8 k/ G& |+ |% `$ \/ N
" H$ E3 K&&_$ t, `$ t1 ?" |
& && && &&&Picture.X += location.X - _prevLocation.X;
, r% Z- g8 k( `
& && && &&&Picture.Y += location.Y - _prevLocation.Y;
& && && &&&_prevLocation =
& && & }( U0 J4 u) G- w" ?/ C&&~7 w. N. p
' R% r5 N5 x, X* U: L
& && & public void ProcessUp(Point location)
& && && &&&//Do Nothing, We might have another touch-id that is
3 ~" M6 k: v6 ^( D
& && && &&&//still down
/ j8 W) U- d# Y7 v8 S8 B7 c& A
/ A4 W" f2 T5 X7 g' a+ d3 j: p
7 f) N4 X+ W- Y. |1 \% w* b
9 P) A( g3 o0 b
(代码片段 – MultiTouch – PictureTrackerClass VB)& m/ A3 p9 O1 o: R
3 B, N) G4 W) {
Visual Basic
''' &summary&
''' Track a single picture.
''' &/summary&8 I: z&&w7 a/ K% E
Imports System.Windows- B, @% `5 Z8 P&&I. m
&&]7 J, P: ?2 ]; q$ V3 \
Class PictureTracker$ A4 Z& V7 E( N' \
0 n# E8 ^, w# V; j
& & Private _prevLocation As Point' k- x! r% ?+ E2 s3 Y% Y&&{
/ d&&D4 q. h. H( m4 _
& & Private _picture As Picture3 f/ h( v1 @3 T' |. @
8 M8 [- l7 r! x5 L
& & Public Property Picture() As Picture. J* X# P" e! S, ?
. P/ `8 f5 |6 |; K/ P
& && &&&Get' X: G5 h- p$ }5 x
& && && && &Return _picture
- k&&Y5 }8 j& V. O( Q( K% g1 g' q
& && &&&End Get" P! H3 L; b" M&&D
& && &&&Set(ByVal value As Picture)
& x( Q" |( h, Z3 Z% T. X' z' x% M
& && && && &_picture = value
, B) f" a5 |0 G% P( K
& && &&&End Set
& & End Property! C5 y! p* S$ c) x
) E7 u2 f$ U- T$ ?
& & Public Sub ProcessDown(ByVal location As Point)
$ h6 w4 m& u8 l3 o0 I
& && &&&_prevLocation = location3 e( W/ o( }3 n4 O+ s0 l
& o8 E! T( ~0 d: n
& & End Sub
9 o7 @: h+ K& A4 K! W. ?
; p6 R8 M$ ]* `2 J0 P% i, N
& & Public Sub ProcessMove(ByVal location As Point)3 M% ^1 Q' c- N4 B
+ ^3 g% p$ R&&f1 v
& && &&&Picture.X += location.X - _prevLocation.X) N&&o8 T( o8 _0 `; A% q&&B
& && &&&Picture.Y += location.Y - _prevLocation.Y
& && &&&_prevLocation = location
& & End Sub
& & Public Sub ProcessUp(ByVal location As Point)
# t8 P/ j6 q&&^+ m3 ^
& && &&&' Do Nothing, We might have another touch-id that is.
& && &&&' Still down.
& & End Sub- V3 W& e- s+ s
9 Q& P/ ~3 }7 z! K1 B" ^$ @/ u
2.& && && && &现在我们需要一个词典,以将活动的触摸 ID 映射到相应的 PictureTracker 实例。我们将创建一个 PictureTrackerManager 类来包含该词典并处理各种触摸事件。无论何时触发了触摸事件,PictureTrackerManager 都将尝试找到关联的 PictureTracker 实例并要求它处理该触摸事件。换言之,PictureTrackerManager 将获得触摸事件。它寻找作为实际事件目标的 PictureTracker 实例并将触摸事件分派给它。现在的问题是如何找到正确的 PictureTracker 实例。我们需要考虑一些不同的场景:
a.& && && && &发生 ProcessDown 事件时,有 3 种选择:
i.& && && && &&&手指触摸一个空位置。不会发生任何事件。2 d! e6 c) p0 g9 Z
5 A7 H( Z- v$ r# c8 \- J8 O
ii.& && && && & 手指触摸新图片。必须创建一个新 PictureTracker 实例,必须在触摸 ID 映射中创建一个新条目。
# H; [4 s2 p1 R! X: t
iii.& && && && &第 2 个(或更多)手指触摸已经被跟踪的图片。我们必须将新的触摸 ID 与相同的 PictureTracker 实例相关联。7 t% D# O1 B# n0 \* Z/ O8 ~" `&&[
b.& && && && &发生 ProcessMove 事件时,有 2 种选择:
* Y. T+ [: @6 m: j4 N1 }( R, i
i.& && && && &&&手指的触摸 ID 未与一个 PictureTracker 相关联。不应该发生任何事件。
6 g- M. k/ _( v# ]! l7 _; U, U
ii.& && && && & 手指的触摸 ID 与一个 PictureTracker 关联。我们需要将事件转发给它。! n: w9 k% N. D. q
; U4 t* t2 M# D5 M
c.& && && && & 发生 ProcessUp 事件时,有 2 种选择:* w* }( ]4 o&&I! ?6 ~' G' F3 u, \/ n
: C% _' Z4 `6 ^, {2 ~. d
i.& && && && &&&删除了一个手指触摸 ID,但是至少还存在一个相关的触摸 ID。我们需要从映射中删除此条目。
! x( y( X$ o) u" v" J; u% A6 @
ii.& && && && & 删除了最后一个相关的触摸 ID。我们需要从映射中删除该条目。图片跟踪器不再使用并且会被当作垃圾收集走。
- U4 O6 o% q4 _! {- |# U& [
3.& && && && &通过分析这些情形,我们可以定义 PictureTrackerManager 的设计条件:
* M! p' L; j- M& E& M9 e. m2 |
a.& && && && &它必须拥有一个映射:触摸 ID &#61664ictureTracker0 r* a) j. n! D! Y8 p
C#' t6 E- g5 I5 n2 ~* G
2 j0 ]8 T* I' Q5 a
private readonly Dictionary&int, PictureTracker& _pictureTrackerMap- x6 c- W9 y8 v3 O
Visual Basic
Private ReadOnly _pictureTrackerMap As Dictionary(Of Integer, PictureTracker). f% F5 U0 }&&p' ^1 E
: u# b( Y8 }1 W
b.& && && && &它必须使用 VisualTree 点击测试或通过在映射中查找来找到 PictureTracker
c.& && && && & 它必须将事件转发给正确的 PictureTracker4 g, j/ t&&I% q
4.& && && && &添加以下 PictureTrackerManager 类:. T* ^# D& j0 l" W
注意:PictureTrackerManager 类也以实验资产的形式在 %TrainingKitInstallDir%\MultiTouch\Assets\PictureHandling 下提供,请选择您想要使用的语言(C# 或 VB)。4 ?" m* Z. e& `- k
(代码片段 – MultiTouch – PictureTrackerManagerClass CSharp)
8 Q8 W; s# @( U0 W, @; }/ V- E
C## _( f! S6 V* Z! B8 x# X
* T. x4 Y5 ~% E( H
class PictureTrackerManager4 q( v$ l- x4 t$ ]
{3 {+ y& ~. A+ c" s. j) y. k
5 K&&K4 T0 F6 i
& & //Map between touch ids and picture trackers( m/ _. o- I, T. I
7 x- L4 o9 ~# A1 b, b
& & private readonly Dictionary&int, PictureTracker& _pictureTrackerMap = new Dictionary&int, PictureTracker&();- Z* G0 e( ?' i/ n2 l- Z7 t* w! f
* o+ z2 ~. I! @2 r" `+ U2 O( n. J* r
& & private readonly Canvas _8 Z&&r5 n' C2 T! Q# P
/ y2 F: `2 Z2 f$ @$ f" X4 N$ R: f& C
& & public PictureTrackerManager(Canvas canvas)
/ ^+ H1 \8 e& m, W3 N2 N! w8 Y
& && &&&_canvas =* K- w& S' ^/ z! [# C
& & public void ProcessDown(object sender, StylusEventArgs args)
& & {5 z3 C8 m7 q4 E7 w7 D
; w1 F: z3 A: b5 L+ {
& && &&&Point location = args.GetPosition(_canvas);. D3 k&&W3 }: I% ]
& && &&&PictureTracker pictureTracker = GetPictureTracker(args.StylusDevice.Id, location);
& && &&&if (pictureTracker == null)
5 i- T&&b. [8 j8 C: H3 \$ z+ i! n
& && && && &
& && &&&pictureTracker.ProcessDown(location);
* M8 Y1 F! T. c: C
& & }9 o8 O7 {; V4 D! `. {
& & public void ProcessUp(object sender, StylusEventArgs args)
& && &&&Point location = args.GetPosition(_canvas);
. ~- }8 `4 _; z% `8 u
& && &&&PictureTracker pictureTracker = GetPictureTracker(args.StylusDevice.Id);&&a/ E6 O' i. T- e' W! @&&L
& && &&&if (pictureTracker == null)' L# [6 ^% `0 ~# d
& && && && &
& && &&&pictureTracker.ProcessUp(location);
: ~&&n! P* w5 ^# G. V
& && &&&_pictureTrackerMap.Remove(args.StylusDevice.Id);0 ?* Z4 i% \6 E: N" X. O
6 t- H' D4 R; `9 e' y
3 A6 A$ \7 X7 Y2 w+ [5 m
& & public void ProcessMove(object sender, StylusEventArgs args)&&{5 c3 H8 o/ J8 v3 X% [&&C
2 @2 [: F) M9 I; M* ]2 U. H& Y
& && &&&PictureTracker pictureTracker = GetPictureTracker(args.StylusDevice.Id);# B( `. Y& g+ C3 @5 @&&B* K
% U3 C" s&&u/ ~9 S1 }) ^$ Q
& && &&&if (pictureTracker == null)
& && && && &2 C/ i) Y' E0 [- \) t( e2 x
&&J# b6 n+ W&&N) D; e& E
& && &&&Point location = args.GetPosition(_canvas);
&&v1 j% ^; Y' u3 z1 ]# Q
& && &&&pictureTracker.ProcessMove(location);3 F' B- p" B&&g/ m" V6 @- Y# A
& & }4 }* }- ~1 l3 W0 {7 J: d- z
9 }&&R8 J+ Q3 g6 ^/ a3 [2 E- q
& & private PictureTracker GetPictureTracker(int touchId)& B! E$ P0 y* c- K
) x! ~) r$ L3 A2 n9 C8 Y
% `$ l6 f$ R8 k) H1 n&&d% E" j% c
& && &&&PictureTracker pictureTracker =. d: H&&c/ }3 Z+ e" \/ |: b* C6 s
: k: z4 F, p
& && &&&_pictureTrackerMap.TryGetValue(touchId, out pictureTracker);3 G! W% c6 j$ D# D1 I
& && &&&return pictureT
# c( M# z) W! e& ?. T( X
& & private PictureTracker GetPictureTracker(int touchId, Point location)* `6 m" \! [( `; a
5 Y, M' O0 Q7 {) }
& && &&&PictureTracker pictureT! ~! I% z5 T: g% Q' r+ P% T
& && &&&//See if we already track the picture with the touchId% a: G4 b. B! S- D6 ]4 T2 [2 `2 t
& && &&&if (_pictureTrackerMap.TryGetValue(touchId, out pictureTracker))
$ {+ w0 Y7 O5 }/ U/ p
& && && && &return pictureT
& s: ^+ R* l( |0 f
& && &&&//Get the picture under the touch location
& && &&&Picture picture = FindPicture(location);
" @) A7 W: J, _
& && &&&if (picture == null)/ _5 [& R* N" F&&N4 N/ {
& && && && &3 g- P* {' x. N% i& S9 R- k
& && &&&//See if we track the picture with other ID
& && &&&pictureTracker = (from KeyValuePair&int, PictureTracker& entry in _pictureTrackerMap& f8 ~. j&&]3 W2 P
& && && && && && && && && &where entry.Value.Picture == picture
& && && && && && && && && &select entry.Value).FirstOrDefault();
8 Q( ^9 p' b6 V2 d$ [
& && &&&//First time
&&k) E3 O* \! o! C7 J3 P&&b4 t* N
& && &&&if (pictureTracker == null). i2 B2 p& I! D+ P: s- F% G
&&a$ P+ U, n1 L2 R; m% G0 S
& && && && &//create new$ }4 E) G1 ]6 E5 k" k) z
& && && && &pictureTracker = new PictureTracker();! R; c, S5 o1 }5 c9 y
& && && && &pictureTracker.Picture =
6 j6 f+ V) c&&o* M4 i& \, [4 ~
& && && && &BringPictureToFront(picture);. V; m3 ?' h. j&&@
5 P( S) M: I6 |& o. D8 C. }0 n
& && &&&}&&O0 ~( \, Z+ V" P
& && &&&//remember the corelation between the touch id and the picture4 S; H8 B: k5 k0 Q% I" C
( N$ y1 `9 o4 {" ]
& && &&&_pictureTrackerMap[touchId] = pictureT
1 G$ Y/ h$ r. k7 |
& && && &return pictureT
& & }- Z& K" u&&\- r
1 p( A$ [2 r, [( Q) }&&P( c
& & /// &summary&
; z' q+ Q8 i7 S4 N' [
& & /// Find the picture in the touch location5 h* |7 H: b6 k
( \% k5 Q) m3 z7 Y5 m( \1 Z8 I&&V
& & /// &/summary&
& & /// &param name=&pointF&&touch location&/param&
6 J1 T: K& C$ M0 Z3 ]$ R
& & /// &returns&The picture or null if no picture exists in the touch&&M% K( I+ X; y0 @: c3 t3 \
& & /// location&/returns&
; M1 o. `2 ?' u4 N3 n0 A! I) A
& & private Picture FindPicture(Point location)
& & {5 N; B+ n' a6 f, I+ Y
& && &&&HitTestResult result = VisualTreeHelper.HitTest(_canvas, location);3 u) O8 J: e/ o2 n6 ]& Z, p
# m9 g8 X/ H' r1 O, \6 _&&?
& && &&&if (result == null)
& && && && &
& && &&&Image image = result.VisualHit as I
; y: ]& `, h0 d. Z
& && && &if (image == null)
& && && && &5 J4 H7 |5 Q1 c( h. u) G5 |, L( v
7 p+ S6 d: ]. }: l, I
& && && &return image.Parent as P
% F2 S; e* @" F" R
: D' A; j$ |6 w- E4 a
& & private void BringPictureToFront(Picture picture)( u+ L4 ?5 m% W4 t9 c
1 M&&[' k9 X0 |&&l
& & {' c8 ?* H& r1 {& \4 j
) E$ H; w* L. u7 X9 |) B8 ]4 H% h+ @
& && &&&if (picture == null), Q. [, I8 y9 j: r
& && && && &2 Y# K, @5 s4 p5 J' h/ V
& && &&&var children = (from UIElement child in _canvas.Children
& && && && && && && && &where child != picture
4 D. x! g' e4 q
& && && && && && && && &orderby Canvas.GetZIndex(child)$ O1 B4 _. \. j/ C( t! C
0 {0 N1 n. x* x- j6 Z
& && && && && && && && &select child).ToArray();
% t2 I- C( K- C1 D) m, b3 g4 U! @
& && &&&for (int i = 0; i & children.L ++i)
: ^0 ~- e9 w' r8 P) a: p3 b, a
& && && && &Canvas.SetZIndex(children[i], i);5 l! k: U3 @% z&&U( A
& && &&&Canvas.SetZIndex(picture, children.Length);
0 c# B9 U8 \5 O# ?: ~5 m6 q
- u) {, `) U* e5 {) b1 {* s
(代码片段 – MultiTouch – PictureTrackerManagerClass VB)
0 k( B+ s8 m2 _
Visual Basic! z* x- x: i$ Y7 S0 t4 z
Imports System.Windows
7 g/ C2 T# K- l9 A
Imports System.Windows.Controls2 m! k" V" ~$ z- f5 e/ \# R
; L" S+ [8 t: O( _$ x( o5 s
/ D1 S: e, n! B3 X" S8 }
Class PictureTrackerManager
& & ' Map between touch ids and picture trackers1 M8 T* I* |: @# q
; L- m2 c: j- F# A, a4 N: r
& & Private ReadOnly _pictureTrackerMap As New Dictionary(Of Integer, PictureTracker)
& & Private ReadOnly _canvas As Canvas9 R$ R6 T7 v. S; u
& & Public Sub New(ByVal canvas As Canvas)( i" n2 j+ F) d# L3 d8 r( L
" j8 j- f) f6 P' X; y2 w2 p, _
& && &&&_canvas = canvas4 D9 r8 x. C5 P0 H$ ?( O- n9 W
& & End Sub3 n7 h6 O/ g# Z: M$ U7 Z+ z
5 s* e5 w- X2 N* z
& & Public Sub ProcessDown(ByVal sender As Object, ByVal args As StylusEventArgs)+ s7 M9 ~1 v* _, e) `
& && &&&Dim location = args.GetPosition(_canvas)6 C; d7 X7 ^5 r& c' j. ?. M" M* T
+ B9 N/ B7 y! v1 A4 `
& && &&&Dim pictureTracker = GetPictureTracker(args.StylusDevice.Id, location)
# l2 x+ u&&n) _5 S, u% S
& && &&&If pictureTracker Is Nothing Then Return
5 t& i6 P5 z4 A9 j
) ^# R( m) ]1 _1 R& r# e
& && &&&pictureTracker.ProcessDown(location): T3 @( a# l# Y( Y% c- k
& & End Sub; L4 F7 N2 o/ |' y) d3 l
4 ~" Z( X& c3 |% b& s- c4 m
& & Public Sub ProcessUp(ByVal sender As Object, ByVal args As StylusEventArgs)2 m&&_8 J' C) @* E&&a" T+ I
, c" T1 P( U% H
& && &&&Dim location = args.GetPosition(_canvas)$ H. F2 U- o" `8 t6 a
9 e5 S: c/ ]3 ]
& && &&&Dim pictureTracker = GetPictureTracker(args.StylusDevice.Id)5 S8 P" ]4 r&&Z4 e- w
& && &&&If pictureTracker Is Nothing Then Return
& && &&&pictureTracker.ProcessUp(location)
& && &&&_pictureTrackerMap.Remove(args.StylusDevice.Id)
7 ~6 j& g! u% Z* c7 _% i7 h6 F
& & End Sub
& & Public Sub ProcessMove(ByVal sender As Object, ByVal args As StylusEventArgs)$ `8 p& q7 J8 ~% e' H0 X
& && &&&Dim pictureTracker = GetPictureTracker(args.StylusDevice.Id)7 p4 a3 F8 m4 J8 o3 K
& && &&&If pictureTracker Is Nothing Then Return
- A* p0 ^9 L. s: T, k. n&&q# p
8 q$ z& R( p- f' l, ]
& && &&&Dim location = args.GetPosition(_canvas)
& && &&&pictureTracker.ProcessMove(location). D5 n( x0 }0 M! C: c+ W# c
1 u6 i# z& i9 _$ [: U4 I- |" _1 B
& & End Sub; s0 N. n9 ^9 t' Q
& & Private Function GetPictureTracker(ByVal touchId As Integer) As PictureTracker&&b3 i. G9 e( X
& && &&&Dim pictureTracker As PictureTracker = Nothing* \9 I( X3 Q0 L3 h, u
7 [% G: z- M$ M! b0 q
& && &&&_pictureTrackerMap.TryGetValue(touchId, pictureTracker)4 U9 J% q/ H5 K0 e" f
& && &&&Return pictureTracker4 U2 k, {4 |( n+ g
8 V: d* Q7 v1 e! i8 b
& & End Function8 I; M) E7 @; B4 b
& & Private Function GetPictureTracker(ByVal touchId As Integer, ByVal location As Point) As PictureTracker, K: L( A! {" e. ^( k/ {) l
" B: Y' e. c1 Q5 u
& && &&&Dim pictureTracker As PictureTracker = Nothing
& && &&&' See if we already track the picture with the touchId
+ E" ^8 n( u, J, Z" r: |
& && &&&If _pictureTrackerMap.TryGetValue(touchId, pictureTracker) Then Return pictureTracker
" c" x1 o" W, h, W$ R
" q) Q* S8 o9 r6 f
& && &&&' Get the picture under the touch location% B. v7 f" o! F+ j5 P* J& X
& && &&&Dim picture = FindPicture(location)
& && &&&If picture Is Nothing Then Return Nothing6 X' c/ _' V- h' o- y! T" r+ t
& && &&&' See if we track the picture with other ID
+ k: \/ I+ z2 {8 ], a9 W
& && &&&pictureTracker = (From entry In _pictureTrackerMap _
& && && && && && && && &&&Where entry.Value.Picture Is picture _
* ~( J# F" l5 c/ b4 |1 y- i! I
& && && && && && && && &&&Select entry.Value).FirstOrDefault()
0 \/ d* u5 T% c
& && &&&' First time
& && &&&If pictureTracker Is Nothing Then3 z% C5 X&&}7 E9 r7 Z&&s
$ A& H" a9 W* n1 E) \% G2 L/ Y
& && && && &' Create new
2 l4 U! G" W! i- B8 l6 j
& && && && &pictureTracker = New PictureTracker()8 S" Y$ O5 G, m+ N1 [; @
3 M$ a& L0 d' B) U! N
& && && && &pictureTracker.Picture = picture
& && && && &BringPictureToFront(picture)
& `5 \' B! s. A
& && &&&End If
. C0 X, {" m4 f+ l" q
& && &&&' Remember the corelation between the touch id and the picture
& && &&&_pictureTrackerMap(touchId) = pictureTracker
3 B6 i9 R# R, g& B8 u! e0 e3 q' i
& && &&&Return pictureTracker&&j0 M& `1 c" D( n/ t: t5 R* K6 z
& & End Function+ }% [6 z! M' H- z0 N- z
: a* q& G; }; N% D9 N&&L, b( s
& & ''' &summary&3 `8 U2 H& ]; _&&j
& & ''' Find the picture in the touch location7 T7 B: ^0 ]4 O4 m( h0 n
' W* K: x9 j0 g* ^
& & ''' &/summary&
& & ''' &param name=&pointF&&touch location&/param&( ~9 z3 B&&O2 d
: a0 }( Q: ]) Z, o: r/ e( `
& & ''' &returns&The picture or null if no picture exists in the touch
3 u+ E: T5 q9 [& ~- n
& & ''' location&/returns&9 r3 y: w# B4 S, }8 s6 {
5 W' U2 y. X$ M9 K) r6 l
& & Private Function FindPicture(ByVal location As Point) As Picture
: Q, t5 Z4 f8 K( ~! U( Y/ k
& && &&&Dim result = VisualTreeHelper.HitTest(_canvas, location)
) m# G4 Z4 h" E) B
& && &&&If result Is Nothing Then Return Nothing+ `- b8 w: {! a, u
* G0 P2 R9 A8 x$ p9 R- p
& && &&&Dim image = TryCast(result.VisualHit, Image)# d+ d" L4 x: U% J, H9 ]' Z9 o
3 `0 l! X4 ^( }5 A
& && &&&If image Is Nothing Then Return Nothing
& && &&&Return TryCast(image.Parent, Picture)
& & End Function
& & Private Sub BringPictureToFront(ByVal picture As Picture)
. r2 {7 [: Z' |- ~3 u- `6 e
& && &&&If picture Is Nothing Then Return
7 s! B4 ]0 h& O) K/ X$ V, K
& && &&&Dim children = (From child In _canvas.Children _
& && && && && && && && &Where child IsNot picture _3 z&&M1 k% M5 W
" V&&u) L- F7 |: K
& && && && && && && && &Order By Canvas.GetZIndex(child) _4 u9 V; x6 O% c
6 _/ g+ i% w&&l' u
& && && && && && && && &Select child).ToArray()
; l1 i/ t9 @4 A: |, e
& && &&&For i = 0 To children.Length - 1&&}$ D2 I' J% c1 I; H0 Q
& && && && &Canvas.SetZIndex(children(i), i), Z6 p! x( M7 |/ x& f5 ~2 s
! z7 L" j9 T* r, I9 y3 x
& && &&&Next i
9 ^) W&&x6 h! p4 A" \( g
& && &&&Canvas.SetZIndex(picture, children.Length)
+ C. w0 V& g9 [
& & End Sub
5 w5 |0 m: G4 a* e3 p7 ]' R
5.& && && && &将以下字段声明添加到 MainWindow 类的开头:
C## B4 O0 w$ L. f% ?% U" x' ~
6 G- ?0 H1 ^% Z, z
private readonly PictureTrackerManager _pictureTrackerM
Visual Basic
Private ReadOnly _pictureTrackerManager As PictureTrackerManager# U6 x2 [* `1 t# G+ n6 ^, b. `8 p4 u9 ]
6.& && && && &修改 MainWindow 构造函数:9 _4 K) ^0 t* R" F4 U% T
a.& && && && &在调用 InitializeComponent() 之后,添加管理器初始化:4 ]8 ]# C; E) m7 A: z
&&n9 Y) }3 d. U: A! g! E) k
C#& I3 |3 p6 i2 `, {" q9 F
* l' D5 F- S$ B5 I2 |) D
_pictureTrackerManager = new PictureTrackerManager(_canvas);
# f! q- s9 z8 p6 Z2 H
Visual Basic
_pictureTrackerManager = New PictureTrackerManager(_canvas)
; G* G7 ~! X0 N9 `7 g
b.& && && && &更改触笔事件注册代码
! y- J( J0 ]( _- m2 b& b
(代码片段 – MultiTouch – PictureTrackerManagerEventHandlers CSharp)
C#3 j+ Y' I( a9 U' d' L
' R6 `, _( I+ A5 |
//Register for stylus (touch) events
& o) ?# u0 o5 O
StylusDown += _pictureTrackerManager.ProcessD' w9 X: A" {; y/ q: F9 E
8 G/ j, h, m9 B1 S! s& a7 R& C
StylusUp += _pictureTrackerManager.ProcessUp;
StylusMove += _pictureTrackerManager.ProcessM
! T4 u% u# k5 t" R" h
(代码片段 – MultiTouch – PictureTrackerManagerEventHandlers VB)% O1 H7 }1 n& k1 Q- X& U: D
! i. T" X# k
Visual Basic4 c6 o9 z. Z0 h2 k
/ E9 }+ w0 a5 h
' Register for stylus (touch) events
AddHandler Me.StylusDown, AddressOf _pictureTrackerManager.ProcessDown' g# M" K- Y! p2 j1 \3 V1 j
* A9 ]+ K* Q: l$ ~0 z
AddHandler Me.StylusMove, AddressOf _pictureTrackerManager.ProcessMove
AddHandler Me.StylusUp, AddressOf _pictureTrackerManager.ProcessUp, q9 x5 s/ P+ C2 S% f) }
2 U" W1 h0 W* v: ~4 W$ Q
# i) t( ~9 M9 |5 {* e
7.& && && && &从 MainWindow 类删除 ProcessDown、ProcessMove 和 ProcessUp 事件处理程序。这里将不再需要它们,因为它们现在已包含在 PictureTrackerManager 类中。% D8 S. H) p4 L0 a
# K$ |; O# f6 k5 K! ]$ i& f9 A% y&&p
8.& && && && &编译并运行。尝试同时抓取多张图片。尝试使用多个手指抓取一张图片。发生了什么情况?为什么?
任务 5 – 使用多点触摸操作处理图片 " H( K- j9 ~6 f' }
3 \; \# [! b+ a: ~. d+ @1 z
. F/ P4 h0 x! X7 @! z3 Y* `- W
到目前为止,使用触摸事件处理图片与使用鼠标功能并没有太大区别。在本任务中,我们将: 7 c6 S4 h7 |$ b0 L
2 G: z7 Z) F" o6 D0 l6 V
•& && && && && &添加使用多个手指操作图片的能力 $ u2 U* q* A4 [' G2 N- B
& k5 Q! G2 a$ E5 g5 }# q, J. M" ]
•& && && && && &同时平移、缩放和旋转图片
$ N/ Q2 j0 i& u/ p9 L
•& && && && && &同时操作多张图片 " x4 U2 b# G% Q+ q& P% E1 D
. h' z8 T9 x- g
我们已经知道如何将正确的事件分派给相应的 PictureTracker,但我们还不知道如何决定在发生多个事件之后需要采取的操作。这正是 Windows 7 多点触摸机制的用武之地。它拥有一个操作处理器来使用触摸 ID 事件并生成合适的操作事件。您只需实例化一个操作处理器,注册其事件,并为它提供触摸 ID + 位置事件对。&&
&&W1 y7 J- i" \, ?
操作处理器是一个 COM 对象。要在 .NET 中使用它,可以使用 Windows 7 Integration Library 示例。ManipulationProcessor .NET 包装器类构造函数获得一个枚举值,该值告诉它要报告哪些操作。在我们的示例中,我们希望报告所有操作。该处理器有 3 个事件:ManipulationStarted、ManipulationCompleted 和 ManipulationDelta。ManipulationDelta 是我们所关注的事件。它提供了平移、旋转和缩放的偏移量。9 K7 L( D% S7 r# Z
1.& && && && &更改整个 PictureTracker 类。! @9 R- p! B2 m2 i/ d
(代码片段 – MultiTouch – PictureTrackerManipulationProcessorClass CSharp)
. h, n, _* h9 l8 b
C#- Q7 ]! e, e8 D6 }0 d+ t
2 K. ]0 I8 o% d
class PictureTracker* y$ M4 z0 c* M6 u7 `
+ l9 e" v4 [: d9 d1 Y&&P&&C; B
& & private readonly ManipulationProcessor _processor =&&S+ a# Y" |; k7 [8 g
& && &&&new ManipulationProcessor(ProcessorManipulations.ALL);) s/ Y% B7 V( h&&l& E* z: N) B, H7 {
& & public PictureTracker()
& & {5 p' y% Y, o- z, H3 l
& && &&&_processor.ManipulationStarted += (s, e) =&6 w) |: D5 m& f* ]- H+ `
& && && && &System.Diagnostics.Trace.WriteLine(&Manipulation has started: & + Picture.ImagePath);
4 a$ E. }8 Z6 X+ f$ ?0 M
& && &&&};; g( ]: w* M' C, {( ]+ v* {
) _, f# Z* K&&c; q) e) b" H
& && &&&_processor.ManipulationCompleted += (s, e) =& ! A1 Z: g9 X&&e: r. B&&f
- k+ ~, L! K3 e2 ?! Q7 i/ i
& && &&&{3 t$ J! O/ G0 J& t
0 g7 [1 m. B) s9 l2 b' t4 V$ A2 w
& && && && &System.Diagnostics.Trace.WriteLine(&Manipulation has completed: & + Picture.ImagePath);
& && &&&};* K, p9 j# U* P( S
9 [0 @* n) G0 @+ I9 B
& && &&&_processor.ManipulationDelta += ProcessManipulationD- L+ R6 _: p&&@" O* R7 I8 A
2 w5 p' {* ]; ~2 _4 {! n9 i
& & }$ t* M8 q7 R. p8 {6 H/ J# V&&z( |
& & public Picture Picture { }
% v- d- h( r- H& T) m6 {8 a& u
& & public void ProcessDown(int id, Point location)' p1 M2 Q7 ^* M! e: c# f$ K
& & {- I6 A8 U3 F) `3 ^$ K
& h/ e4 M* U. m, ~4 ]5 g. U: e
& && &&&_processor.ProcessDown((uint)id, location.ToDrawingPointF());! y7 u% t' x! ~" o
! r7 v3 B# P, n+ e&&s4 `) b! M4 g
& & }2 H. m9 E7 y) h! L
7 r" T+ g+ ]2 u1 c
& & public void ProcessMove(int id, Point location)
& && &&&_processor.ProcessMove((uint)id, location.ToDrawingPointF());
5 `+ h3 J4 w: Z' k# f1 Z
& & public void ProcessUp(int id, Point location)9 J$ h/ g) W1 h: z# s: V" \4 N) d
& & {% R, p" L8 i/ ~9 F; E! m/ ?
& && &&&_processor.ProcessUp((uint)id, location.ToDrawingPointF());
/ `! ~7 P$ ^3 [: |6 X* v6 I
& & //Update picture state
& & private void ProcessManipulationDelta(object sender, ManipulationDeltaEventArgs e)2 _- Z4 y# j&&Y; N) E) A# \) a
& & {( I) @; F* N2 }3 ^$ j. l' J
& && &&&if (Picture == null)% v9 F- z9 {8 `/ Y8 l
4 F0 S$ B7 g0 `# [% ^% T6 g6 B
& && && && &
& && &&&Picture.X += e.TranslationDelta.W' g! e7 `; J+ W/ @
& E. r" b2 ~# S; K
& && &&&Picture.Y += e.TranslationDelta.H; Q&&O&&F0 P" @* n1 ?
& && &&&Picture.Angle += e.RotationDelta * 180 / Math.PI;' l$ l! N+ O& [) S9 r
2 D: a7 e( v/ N; j! S7 E. w
& && &&&Picture.ScaleX *= e.ScaleD1 Z5 s2 e7 X" ?+ L" B
" D- O3 a$ |! I; k- ]8 J2 ?# _
& && &&&Picture.ScaleY *= e.ScaleD
6 W8 g$ n& S% ]0 l0 f6 _; o: H' E9 k" F
% `' W9 O" ?* w8 T8 P2 }, A
地址:成都市高升桥东路2号高盛中心1109室 电话:028--
版权所有 Copyright(C)
All rights reserved
电子邮件:
在线咨询QQ:
MSN:蜀ICP备号}

我要回帖

更多关于 jquery触屏滑动事件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信