Das Erkennen von Berührung in Windows Phone 8 nutzt das System.Windows.Input.Touch.FrameReported -Ereignis, das das raueste und sicherlich das reaktionsschnellste Berührungsereignis für Entwickler ist.Wie erkennt man zwei gleichzeitige Berührungen?
Sie würden die Veranstaltung wie diese verwenden:
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();
}
};
}
(mit einem 920 Lumia getestet)
Dies funktioniert wie ein Charme - so lange, wie es zu einem Zeitpunkt nur eine einzige Note ist. Wenn der Benutzer versucht, zwei oder mehr Punkte gleichzeitig zu berühren (und ich meine genau die gleiche Zeit), wird das Ereignis überhaupt nicht ausgelöst. Wenn der Benutzer versucht, zwei oder mehr Punkte fast gleichzeitig zu berühren (im Bruchteil einer Sekunde), wird das Ereignis ausgelöst und beide Punkte werden gemeldet.
Wie kann ich zwei gleichzeitige Berührungen erkennen?
Falls Sie die XAML sehen möchten, hier ist die 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>
@Jerry .. Haben Sie dies versuchen? Lassen Sie einen lastTappedTime-Tick in einer Instanzvariable. Behandle das Tap-Ereignis in allen Ellipsen und überprüfe den Unterschied zwischen lastTappedTime und jetzt time. Wenn die Differenz weniger als 200 Millisekunden beträgt, können wir sie als Simul-Touch betrachten. Andernfalls legen Sie die neue lastTappedTime fest. – kanchirk
Um klarer zu sein, das Problem ist nicht zu erkennen, ob sie gleichzeitig sind, ist es, dass zwei gleichzeitige Berührungen nicht das FrameReported-Ereignis auslösen. –
Danke für die Klärung. – kanchirk