如何在移动过程中跟踪手指的位置?
How to track a finger's location during movement?
假设有一个 ImageView (iv),我在创建一个新的 GestureDetector (gs) gs = new GestureDetector(this.Context, listener)
时设置了 iv.SetOnTouchListener(this)
,我如何在每个 0.01 中定位手指的位置 (x,y)秒(如
一个例子)?
我应该使用哪个功能? OnFling
? OnLongPress
?
我不仅在谈论代码,而且我还想了解如何实现每 0.01 秒获取一次手指位置的愿望。有什么想法吗?
您可以实现 View.IOnTouchListener
接口并将其作为侦听器应用到您的视图(在本例中为 ImageView
):
View.IOnTouchListener 实施:
注意:在此示例中使用 Java.Lang.Object 作为基础 class,但您可以使用任何基于 Java.Lang.Object
的 class(Activity,等等...)
public class MyTouch : Java.Lang.Object, View.IOnTouchListener
{
TimeSpan Milli10 = TimeSpan.FromMilliseconds(10);
DateTime oldTime;
public bool OnTouch(View v, MotionEvent e)
{
switch (e.Action)
{
case MotionEventActions.Down:
oldTime = DateTime.Now;
break;
case MotionEventActions.Move:
if (DateTime.Now.Subtract(oldTime) > Milli10)
{
Console.WriteLine($"Touch {e.RawX} : {e.RawY} : tD: {DateTime.Now.Subtract(oldTime)}");
oldTime = DateTime.Now;
}
break;
default:
break;
}
return true;
}
}
然后,如果需要,只需实例化侦听器,并将其应用为 OnTouchListener
:
imageView = FindViewById<ImageView>(Resource.Id.background);
touch = new MyTouch();
imageView.SetOnTouchListener(touch);
更新:
需要添加 LongPress、DoubleTap 等...,subclass GestureDetector.SimpleOnGestureListener
并将其作为内部 class 添加到您的 View.IOnTouchListener 实现中(这是只有一种方式...)
View.IOnTouchListener 加上 SimpleOnGestureListener:
public class MyTouchPlusGestures : Java.Lang.Object, View.IOnTouchListener
{
readonly MyGestures myGestures = new MyGestures();
readonly TimeSpan Milli10 = TimeSpan.FromMilliseconds(10);
readonly GestureDetector gestureDetector;
DateTime oldTime = DateTime.Now;
internal class MyGestures : GestureDetector.SimpleOnGestureListener
{
public override void OnLongPress(MotionEvent e)
{
// do something with press
base.OnLongPress(e);
}
public override bool OnDoubleTap(MotionEvent e)
{
// do something with tap
return base.OnDoubleTap(e);
}
}
public MyTouchPlusGestures(View view)
{
gestureDetector = new GestureDetector(view.Context, myGestures);
view.SetOnTouchListener(this);
}
public bool OnTouch(View v, MotionEvent e)
{
if (!gestureDetector.OnTouchEvent(e))
{
// If the event is not handled in one of your gestures,
// fall through to the MotionEventActions switch.
switch (e.Action)
{
case MotionEventActions.Down:
oldTime = DateTime.Now;
break;
case MotionEventActions.Move:
if (DateTime.Now.Subtract(oldTime) > Milli10)
{
Console.WriteLine($"Touch {e.RawX} : {e.RawY} : tD: {DateTime.Now.Subtract(oldTime)}");
oldTime = DateTime.Now;
}
break;
default:
break;
}
}
return true;
}
}
现在只需将视图传递给您的 MyTouchPlusGestures
实例,手势和触摸侦听器就会分配给您...
imageView = FindViewById<ImageView>(Resource.Id.background);
touch = new MyTouchPlusGestures(imageView);
假设有一个 ImageView (iv),我在创建一个新的 GestureDetector (gs) gs = new GestureDetector(this.Context, listener)
时设置了 iv.SetOnTouchListener(this)
,我如何在每个 0.01 中定位手指的位置 (x,y)秒(如
一个例子)?
我应该使用哪个功能? OnFling
? OnLongPress
?
我不仅在谈论代码,而且我还想了解如何实现每 0.01 秒获取一次手指位置的愿望。有什么想法吗?
您可以实现 View.IOnTouchListener
接口并将其作为侦听器应用到您的视图(在本例中为 ImageView
):
View.IOnTouchListener 实施:
注意:在此示例中使用 Java.Lang.Object 作为基础 class,但您可以使用任何基于 Java.Lang.Object
的 class(Activity,等等...)
public class MyTouch : Java.Lang.Object, View.IOnTouchListener
{
TimeSpan Milli10 = TimeSpan.FromMilliseconds(10);
DateTime oldTime;
public bool OnTouch(View v, MotionEvent e)
{
switch (e.Action)
{
case MotionEventActions.Down:
oldTime = DateTime.Now;
break;
case MotionEventActions.Move:
if (DateTime.Now.Subtract(oldTime) > Milli10)
{
Console.WriteLine($"Touch {e.RawX} : {e.RawY} : tD: {DateTime.Now.Subtract(oldTime)}");
oldTime = DateTime.Now;
}
break;
default:
break;
}
return true;
}
}
然后,如果需要,只需实例化侦听器,并将其应用为 OnTouchListener
:
imageView = FindViewById<ImageView>(Resource.Id.background);
touch = new MyTouch();
imageView.SetOnTouchListener(touch);
更新:
需要添加 LongPress、DoubleTap 等...,subclass GestureDetector.SimpleOnGestureListener
并将其作为内部 class 添加到您的 View.IOnTouchListener 实现中(这是只有一种方式...)
View.IOnTouchListener 加上 SimpleOnGestureListener:
public class MyTouchPlusGestures : Java.Lang.Object, View.IOnTouchListener
{
readonly MyGestures myGestures = new MyGestures();
readonly TimeSpan Milli10 = TimeSpan.FromMilliseconds(10);
readonly GestureDetector gestureDetector;
DateTime oldTime = DateTime.Now;
internal class MyGestures : GestureDetector.SimpleOnGestureListener
{
public override void OnLongPress(MotionEvent e)
{
// do something with press
base.OnLongPress(e);
}
public override bool OnDoubleTap(MotionEvent e)
{
// do something with tap
return base.OnDoubleTap(e);
}
}
public MyTouchPlusGestures(View view)
{
gestureDetector = new GestureDetector(view.Context, myGestures);
view.SetOnTouchListener(this);
}
public bool OnTouch(View v, MotionEvent e)
{
if (!gestureDetector.OnTouchEvent(e))
{
// If the event is not handled in one of your gestures,
// fall through to the MotionEventActions switch.
switch (e.Action)
{
case MotionEventActions.Down:
oldTime = DateTime.Now;
break;
case MotionEventActions.Move:
if (DateTime.Now.Subtract(oldTime) > Milli10)
{
Console.WriteLine($"Touch {e.RawX} : {e.RawY} : tD: {DateTime.Now.Subtract(oldTime)}");
oldTime = DateTime.Now;
}
break;
default:
break;
}
}
return true;
}
}
现在只需将视图传递给您的 MyTouchPlusGestures
实例,手势和触摸侦听器就会分配给您...
imageView = FindViewById<ImageView>(Resource.Id.background);
touch = new MyTouchPlusGestures(imageView);