轉(zhuǎn)帖|其它|編輯:郝浩|2011-07-08 18:07:34.000|閱讀 801 次
概述:過(guò)了捕捉觸控點(diǎn)、以及透過(guò)觸控屏幕來(lái)手寫繪圖之后,當(dāng)然,我們也希望能夠像Surface或是Mobile Phone那樣,能夠用手指直接放大縮小圖形,這一個(gè)部分就牽扯到所謂的筆勢(shì)(gesture)了。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
過(guò)了捕捉觸控點(diǎn)、以及透過(guò)觸控屏幕來(lái)手寫繪圖之后,當(dāng)然,我們也希望能夠像Surface或是Mobile Phone那樣,能夠用手指直接放大縮小圖形,這一個(gè)部分就牽扯到所謂的筆勢(shì)(gesture)了。
盡管Silverlight Touch API中并沒(méi)有直接支持筆勢(shì),但我們還是可以透過(guò)先前介紹過(guò)的API來(lái)實(shí)現(xiàn)相關(guān)的行為。
從概念上來(lái)看,當(dāng)我們要實(shí)現(xiàn)用兩個(gè)觸控點(diǎn)來(lái)縮放圖形時(shí),整個(gè)概念如下:
假設(shè)場(chǎng)景中有多個(gè)觸控點(diǎn),其中有兩個(gè)觸控點(diǎn)同時(shí)點(diǎn)選在某一個(gè)對(duì)象上,并且開(kāi)始拖曳(Move),而拖曳的過(guò)程中兩個(gè)觸控點(diǎn)的距離D愈來(lái)愈遠(yuǎn),我們就視為用戶要將圖形放大,反之,若兩點(diǎn)的距離愈來(lái)愈近,我們則視為圖形縮小。
在這個(gè)概念下,我們需要判斷并處理幾個(gè)狀況:
是否有兩個(gè)觸控點(diǎn)同時(shí)點(diǎn)在一個(gè)對(duì)象上。
這兩個(gè)觸控點(diǎn)移動(dòng)時(shí),取得觸控點(diǎn)之間的距離D。
在觸控點(diǎn)移動(dòng)時(shí),透過(guò)兩點(diǎn)距離D,來(lái)調(diào)整被觸控對(duì)象的大小。
請(qǐng)參考先前pdf的程序一,在先前實(shí)作的功能中,我們僅實(shí)現(xiàn)了拖曳的功能,現(xiàn)在我們看一下『Case TouchAction.Move』部分:
view plaincopy to clipboardprint?
Case TouchAction.Move '當(dāng)動(dòng)作為移動(dòng)
If p.Action = TouchAction.Move Then
'是否還有其他點(diǎn)在同一個(gè)對(duì)象身上?
If isMultiPoints(p.TouchDevice.DirectlyOver, e) Then
'縮放
'如果第一點(diǎn)是空值
If ElementLastDistance(i) = 0 Then
ElementLastDistance(i) = getFirst2PointsDistance(p.TouchDevice.DirectlyOver, e)
Else
Dim offset As Integer = getFirst2PointsDistance(p.TouchDevice.DirectlyOver, e) - ElementLastDistance(i)
ElementLastDistance(i) = getFirst2PointsDistance(p.TouchDevice.DirectlyOver, e)
'rectangle
If element.GetType() Is GetType(Image) Then
CType(element, Rectangle).Height = CType(element, Rectangle).Height * (1 + offset / SenseValue)
CType(element, Rectangle).Width = CType(element, Rectangle).Width * (1 + offset / SenseValue)
End If
End If
Else
'移動(dòng)
'取得新坐標(biāo)
Dim x, y As Integer
x = p.Position.X - originalPointPosistions(i).X
y = p.Position.Y - originalPointPosistions(i).Y
If element IsNot Nothing Then
element.SetValue(Canvas.LeftProperty, originalElementPosistions(i).X + x)
element.SetValue(Canvas.TopProperty, originalElementPosistions(i).Y + y)
End If
End If
End If
Case TouchAction.Move '當(dāng)動(dòng)作為移動(dòng)
If p.Action = TouchAction.Move Then
'是否還有其他點(diǎn)在同一個(gè)對(duì)象身上?
If isMultiPoints(p.TouchDevice.DirectlyOver, e) Then
'縮放
'如果第一點(diǎn)是空值
If ElementLastDistance(i) = 0 Then
ElementLastDistance(i) = getFirst2PointsDistance(p.TouchDevice.DirectlyOver, e)
Else
Dim offset As Integer = getFirst2PointsDistance(p.TouchDevice.DirectlyOver, e) - ElementLastDistance(i)
ElementLastDistance(i) = getFirst2PointsDistance(p.TouchDevice.DirectlyOver, e)
'rectangle
If element.GetType() Is GetType(Image) Then
CType(element, Rectangle).Height = CType(element, Rectangle).Height * (1 + offset / SenseValue)
CType(element, Rectangle).Width = CType(element, Rectangle).Width * (1 + offset / SenseValue)
End If
End If
Else
'移動(dòng)
'取得新坐標(biāo)
Dim x, y As Integer
x = p.Position.X - originalPointPosistions(i).X
y = p.Position.Y - originalPointPosistions(i).Y
If element IsNot Nothing Then
element.SetValue(Canvas.LeftProperty, originalElementPosistions(i).X + x)
element.SetValue(Canvas.TopProperty, originalElementPosistions(i).Y + y)
End If
End If
End If
我們?cè)诔绦虼a當(dāng)中加入了幾個(gè)動(dòng)作,分別是判斷同一個(gè)對(duì)象是否被兩個(gè)以上的觸控點(diǎn)所點(diǎn)選,IC交易網(wǎng)以及這兩個(gè)觸控點(diǎn)之間的距離,接著,再透過(guò)這兩個(gè)觸控點(diǎn)之間的距離來(lái)動(dòng)態(tài)調(diào)整Image對(duì)象的大小,就形成我們需要的效果了。
總的來(lái)說(shuō),Silverlightpdf中的Multi-Touch技術(shù)相較而言并不困難,雖然沒(méi)有龐大的.NET Framework作為后盾,但簡(jiǎn)單好用的Touch API也足以讓我們建構(gòu)出不錯(cuò)的Web/RIA應(yīng)用程序,而具體的實(shí)現(xiàn)方式就有賴開(kāi)發(fā)人員的設(shè)計(jì)了。
總的來(lái)說(shuō),Silverlight作為第一個(gè)支持Multi-Touch功能的RIA/Web應(yīng)用程序開(kāi)發(fā)技術(shù),一舉將因特網(wǎng)應(yīng)用程序的應(yīng)用層面,擴(kuò)展到另一個(gè)領(lǐng)域,讓應(yīng)用程序的價(jià)值大增,也讓開(kāi)發(fā)人員能夠發(fā)揮更多的創(chuàng)意。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載