差分
ナビゲーションに移動
検索に移動
ピンチ
,'''ピンチ'''([[英語]]:[[pinch]])とは、日本語に訳すと「挟む」という意味であり、[[コンピューター]]の世界では主に[[マルチタッチ]]において2本の指を開いたり閉じたりする動作を指す。
ピンチに対応する処理はほとんどのアプリで「拡大縮小」となっている。指でクパー感は直感的でわかりやすい。
非常に稀な例だが、お絵かきソフトで「直線を引く」になっていたものもあったが、これはあまり使い勝手の良いものではなかった。
== 実装例 ==
[[MonoGame]]での実装例を示す。<syntaxhighlight lang="csharp" line="1" start="0">
bool _pinching = false;
float _pinchInitialDistance;
private void HandleTouchInput()
{
if (TouchPanel.IsGestureAvailable)
{
GestureSample gesture = TouchPanel.GetGesture();
if (gesture.GestureType == GestureType.Pinch)
{
// current positions
Vector2 a = gesture.Position;
Vector2 b = gesture.Position2;
float dist = Vector2.Distance(a, b);
// prior positions
Vector2 aOld = gesture.Position - gesture.Delta;
Vector2 bOld = gesture.Position2 - gesture.Delta2;
float distOld = Vector2.Distance(aOld, bOld);
if (!_pinching)
{
// start of pinch, record original distance
_pinching = true;
_pinchInitialDistance = distOld;
}
// work out zoom amount based on pinch distance...
float scale = (distOld - dist) * 0.05f;
ZoomBy(scale);
}
else if (gesture.GestureType == GestureType.PinchComplete)
{
// end of pinch
_pinching = false;
}
}
}
</syntaxhighlight>
ピンチに対応する処理はほとんどのアプリで「拡大縮小」となっている。指でクパー感は直感的でわかりやすい。
非常に稀な例だが、お絵かきソフトで「直線を引く」になっていたものもあったが、これはあまり使い勝手の良いものではなかった。
== 実装例 ==
[[MonoGame]]での実装例を示す。<syntaxhighlight lang="csharp" line="1" start="0">
bool _pinching = false;
float _pinchInitialDistance;
private void HandleTouchInput()
{
if (TouchPanel.IsGestureAvailable)
{
GestureSample gesture = TouchPanel.GetGesture();
if (gesture.GestureType == GestureType.Pinch)
{
// current positions
Vector2 a = gesture.Position;
Vector2 b = gesture.Position2;
float dist = Vector2.Distance(a, b);
// prior positions
Vector2 aOld = gesture.Position - gesture.Delta;
Vector2 bOld = gesture.Position2 - gesture.Delta2;
float distOld = Vector2.Distance(aOld, bOld);
if (!_pinching)
{
// start of pinch, record original distance
_pinching = true;
_pinchInitialDistance = distOld;
}
// work out zoom amount based on pinch distance...
float scale = (distOld - dist) * 0.05f;
ZoomBy(scale);
}
else if (gesture.GestureType == GestureType.PinchComplete)
{
// end of pinch
_pinching = false;
}
}
}
</syntaxhighlight>