#眉標=Silverlight 3.0、Multi-Touch、RIA #副標=Silverlight 3.0技術應用(3) #大標=Silverlight 3多點觸控程式開發 #作者=文/圖 董大偉 ===<反灰>============= Public Sub New() InitializeComponent() 'Hook FrameReported事件 AddHandler Touch.FrameReported, AddressOf Touch_FrameReported End Sub ================ ===<反灰>============= 'Touch事件 Sub Touch_FrameReported(ByVal sender As Object, ByVal e As TouchFrameEventArgs) …略… End Sub ================ ===<反灰>============= For Each p As TouchPoint In e.GetTouchPoints(Nothing) (…p為每一個點…) Next ================ ==<表>=========== 表1:TouchPoint物件重要參數 屬性 功能 值 Action 回傳該觸控點目前的行為 Down/Move/Up Position 回傳該觸控點的座標 Point物件 TouchDevice. DirectlyOver 回傳該觸控點點選到的物件(UIElement) UIElement================ ============= 程式1 For Each p As TouchPoint In e.GetTouchPoints(Nothing) '取得點選物件 Dim element As UIElement = p.TouchDevice.DirectlyOver Select Case p.Action '當動作為點選 Case TouchAction.Down '取得Touch點原座標 originalPointPosistions(i).X = p.Position.X originalPointPosistions(i).Y = p.Position.Y '取得物件原座標 If element IsNot Nothing Then originalElementPosistions(i).X = element.GetValue(Canvas.LeftProperty) originalElementPosistions(i).Y = element.GetValue(Canvas.TopProperty) ElementLastDistance(i) = 0 End If Case TouchAction.Move '當動作為移動 If p.Action = TouchAction.Move Then '移動 '取得新座標 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 Case TouchAction.Up '當動作為放開 originalPointPosistions(i) = Nothing originalElementPosistions(i) = Nothing ElementLastDistance(i) = 0 End Select i += 1 Next ================ ============= 程式2 Public Sub New() InitializeComponent() 'Hook FrameReported事件 AddHandler Touch.FrameReported, AddressOf Touch_FrameReported End Sub '同時支援的點數 Const MaxTouchPoints As Integer = 10 '保留每一個點的Stroke Dim NewStroke(MaxTouchPoints) As System.Windows.Ink.Stroke '觸控事件 Sub Touch_FrameReported(ByVal sender As Object, ByVal e As TouchFrameEventArgs) Dim i As Integer = 0 '處理每一個點 For Each p As TouchPoint In e.GetTouchPoints(Nothing) Select Case p.Action '當動作為點選 Case TouchAction.Down '建立新Stroke NewStroke(i) = New System.Windows.Ink.Stroke '加入InkPresenter1 InkPresenter1.Strokes.Add(NewStroke(i)) Case TouchAction.Move '當動作為移動 '將每一個點加入Stroke NewStroke(i).StylusPoints.Add(New StylusPoint(p.Position.X, p.Position.Y)) End Select i += 1 Next End Sub ================ ============= 程式3 Case TouchAction.Move '當動作為移動 If p.Action = TouchAction.Move Then '是否還有其他點在同一個物件身上? If isMultiPoints(p.TouchDevice.DirectlyOver, e) Then '縮放 '如果第一點是空值 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 '移動 '取得新座標 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 ================