2013-05-29 26 views
5

Phát hiện cảm ứng trong Windows Phone 8 thúc đẩy sự kiện System.Windows.Input.Touch.FrameReported là sự kiện cảm ứng nhạy nhất và chắc chắn nhất có sẵn cho nhà phát triển.Làm thế nào để phát hiện hai lần chạm đồng thời?

Bạn sẽ sử dụng sự kiện như thế này:

public MainPage() 
{ 
    InitializeComponent(); 

    // setup sounds 
    Ellipse1.Tag = new Uri("Sounds/GVD_snr1.wav", UriKind.Relative); 
    Ellipse2.Tag = new Uri("Sounds/GVD_snr2.wav", UriKind.Relative); 
    Ellipse3.Tag = new Uri("Sounds/GVD_snr3.wav", UriKind.Relative); 
    Ellipse4.Tag = new Uri("Sounds/GVD_snr4.wav", UriKind.Relative); 
    Ellipse5.Tag = new Uri("Sounds/GVD_snr5.wav", UriKind.Relative); 
    Ellipse6.Tag = new Uri("Sounds/GVD_snr6.wav", UriKind.Relative); 
    Ellipse7.Tag = new Uri("Sounds/Gong.wav", UriKind.Relative); 

    // respond to touch(es) 
    var _Ellipses = new[] { Ellipse1, Ellipse2, Ellipse3, Ellipse4, Ellipse5, Ellipse6, Ellipse7 }; 
    System.Windows.Input.Touch.FrameReported += (s, e) => 
    { 
     var _Touches = 
      from touch in e.GetTouchPoints(null) 
      where touch.Action == System.Windows.Input.TouchAction.Down 
      let ellipse = touch.TouchDevice.DirectlyOver as Ellipse 
      where _Ellipses.Contains(ellipse) 
      select ellipse; 
     System.Diagnostics.Debug.WriteLine("{0} touch(es).", _Touches.Count()); 
     foreach (var ellipse in _Touches) 
     { 
      var _Stream = Application.GetResourceStream(ellipse.Tag as Uri).Stream; 
      var _SoundEffect = Microsoft.Xna.Framework.Audio.SoundEffect.FromStream(_Stream); 
      Microsoft.Xna.Framework.FrameworkDispatcher.Update(); 
      _SoundEffect.Play(); 
     } 
    }; 
} 

(thử nghiệm với một Lumia 920)

này hoạt động như một nét duyên dáng - miễn là chỉ có một liên lạc duy nhất tại một thời điểm. Khi người dùng cố gắng chạm vào hai hoặc nhiều điểm cùng một lúc (và tôi có nghĩa là chính xác cùng một lúc) sự kiện này không được nêu ra. Khi người dùng cố gắng chạm vào hai hoặc nhiều điểm gần như đồng thời (chỉ cách nhau hai giây) thì sự kiện được nâng lên và cả hai điểm đều được báo cáo.

Làm cách nào để phát hiện hai lần chạm đồng thời?

Trong trường hợp bạn muốn xem XAML, đây là XAML:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 

    <Grid.Resources> 
     <Style TargetType="Ellipse"> 
      <Setter Property="HorizontalAlignment" Value="Left" /> 
      <Setter Property="VerticalAlignment" Value="Top" /> 
     </Style> 
    </Grid.Resources> 

    <Ellipse x:Name="Ellipse1" Fill="Blue" Height="177" Margin="17,17,0,0" Width="177"/> 
    <Ellipse x:Name="Ellipse2" Fill="#FFFFA300" Height="223" Margin="212,25,0,0" Width="223"/> 
    <Ellipse x:Name="Ellipse3" Fill="#FFFF00E8" Height="97" Margin="89,207,0,0" Width="97"/> 
    <Ellipse x:Name="Ellipse4" Fill="#FF00C135" Height="162" Margin="186,249,0,0" Width="162"/> 
    <Ellipse x:Name="Ellipse5" Fill="#FF00AEFF" Height="272" Margin="59,416,0,-81" Width="272"/> 
    <Ellipse x:Name="Ellipse6" Fill="Red" Height="97" Margin="320,395,0,0" Width="97"/> 
    <Ellipse x:Name="Ellipse7" Fill="#FFF3FF00" Height="133" Margin="10,304,0,0" Width="133"/> 

</Grid> 
+0

@Jerry .. Bạn thử này? Có một lastTappedTime tick trong một biến instance. Xử lý sự kiện Nhấn trong tất cả các dấu ba chấm và kiểm tra sự khác biệt giữa lastTappedTime và bây giờ là thời gian. Nếu sự khác biệt nhỏ hơn 200 mili giây, chúng ta có thể xem xét nó một cách an toàn Simul-Touch nếu không Đặt lastTappedTime mới. – kanchirk

+0

Để rõ ràng hơn, vấn đề không được phát hiện nếu chúng đồng thời, đó là hai lần chạm đồng thời không làm tăng sự kiện FrameReported. –

+0

Cảm ơn bạn đã làm rõ. – kanchirk

Trả lời

0

Thêm này giải quyết vấn đề:

var _Timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(50) }; 
_Timer.Tick += (s, e) => 
{ 
    try { Microsoft.Xna.Framework.FrameworkDispatcher.Update(); } 
    catch { } 
}; 
_Timer.Start(); 
Các vấn đề liên quan