Maui for Android 模拟退格键操作

Wenyan Zhang (Shanghai Wicresoft Co,.Ltd.) 32,471 信誉分 Microsoft 供应商
2024-05-29T09:41:48.9533333+00:00

大家好。

 

在我的应用程序中,我想模拟退格键动作,我想要当用户按住按钮以每 300 毫秒删除一个字符时,直到按钮松开,请问我该怎么做到。

 

谢谢。

 

此问题整理于:https://learn.microsoft.com/en-us/answers/questions/1686402/maui-for-android-simulate-backspace-button-action

.NET MAUI
.NET MAUI
一种 Microsoft 开源框架,用于构建跨移动设备、平板电脑、台式机的原生设备应用程序。
90 个问题
0 个注释 无注释
{count} 票

1 个答案

排序依据: 非常有帮助
  1. Yonglun Liu (Shanghai Wicresoft Co,.Ltd.) 44,016 信誉分 Microsoft 供应商
    2024-05-29T09:42:37.8966667+00:00

    你好,

    你可以通过监听手指按压和抬起的触摸事件来实现此功能。

    首先,当手指长按时,在触摸事件中会将始终触发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
            }
    

    如果答案是正确的,请点击“接受答案”并点赞。 如果您对此答案还有其他疑问,请点击“评论”。 注意:如果您想接收相关电子邮件,请按照我们的文档中的步骤启用电子邮件通知 此线程的通知。

    0 个注释 无注释

你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。