.NET MAUI
一种 Microsoft 开源框架,用于构建跨移动设备、平板电脑、台式机的原生设备应用程序。
90 个问题
大家好。
在我的应用程序中,我想模拟退格键动作,我想要当用户按住按钮以每 300 毫秒删除一个字符时,直到按钮松开,请问我该怎么做到。
谢谢。
你好,
你可以通过监听手指按压和抬起的触摸事件来实现此功能。
首先,当手指长按时,在触摸事件中会将始终触发KeyDown。因此,您可以通过在手指长时间按下时启动线程来完成每 300 毫秒删除一个字符的功能。
当用户短按时,您需要确定用户手指被按下和抬起手指之间的事件间隔。在此示例中,如果时间间隔小于 300ms,则将其视为短按并删除一个字符。
下面是示例代码。
//Implement the OnTouchListener in Android folder
public class TouchToDelete : Java.Lang.Object, IOnTouchListener
{
private EditText editText;
long lastTimeStamp;//Record the time pressed
bool isPress;//Determine if you are pressing
public TouchToDelete(EditText editText)
{
this.editText = editText;
}
public bool OnTouch(global::Android.Views.View? v, MotionEvent? e)
{
if (e.Action == MotionEventActions.Down) {
isPress = true;
lastTimeStamp = GetCurrenttimemillis();
Thread t1 = new Thread(new ThreadStart(delegate
{
while (isPress)
{
if(GetCurrenttimemillis() - lastTimeStamp > 300)
{
// If the keystroke event exceeds 300ms, one character is deleted every 300ms
MainThread.BeginInvokeOnMainThread(() =>
{
editText.DispatchKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.Del));
});
try
{
Thread.Sleep(300);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
}));
t1.Start();
}
else if (e.Action == MotionEventActions.Up)
{
if(GetCurrenttimemillis()- lastTimeStamp <= 300)
{
editText.DispatchKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.Del));
}
isPress = false;
}
return true;
}
private long GetCurrenttimemillis() // Get the current time in milliseconds
{
return (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
}
}
// Invoke the Listener in MAUI part.
protected override void OnHandlerChanged()
{
base.OnHandlerChanged();
#if ANDROID
var btn = test_backspace.Handler.PlatformView as Android.Widget.Button;
var edit = test_entry.Handler.PlatformView as Android.Widget.EditText;
btn.SetOnTouchListener(new TouchToDelete(edit));
#endif
}
如果答案是正确的,请点击“接受答案”并点赞。 如果您对此答案还有其他疑问,请点击“评论”。 注意:如果您想接收相关电子邮件,请按照我们的文档中的步骤启用电子邮件通知 此线程的通知。