• Xamarin Android 监听音量键(下)


    上篇在 MainActivity 中重写了按键事件(OnKeyDown),获取了音量键键值并打印了出来,当然,手机物理按键和虚拟按键(音量键、返回键、菜单键等)均可通过该按键事件被捕获。

    但是,按键重写在 MainActivity 中,音量键按下时执行的方法在其他页面中。

    作者冒出了一个不成熟的想法:利用(publish-subscribe)模式,在 MainActivity 中定义发布者(publish),实例化后层层传递到达 我的页面中,,再将实例化后的订阅者(subscribe)连接上。如图从左到右依次为类实例化的顺序:

    方案实现:

    1、发布者订阅者类设计

    namespace NetworkAssistant
    {
        //声明按键事件监听委托接口
        public delegate void OnKeyDown_callback(int keyCode);
        //按键事件发布者
        public class MyKeyEventPublish
        {
            private int KeyCode;
            public Action<int> OnKeyDown { set; get; }
            public int OnKeyDownChanged
            {
                get { return KeyCode; }
                set
                {
                    KeyCode = value;
                    OnKeyDown?.Invoke(value);
                }
            }
        }
        //按键事件订阅者
        public class MyKeyEventSubscribe
        {
            OnKeyDown_callback cb;
            public MyKeyEventSubscribe(OnKeyDown_callback _cb)
            {
                cb = _cb;
            }
    
            public void OnKeyDown( int newKeyCode)
            {
                Console.WriteLine($"[{newKeyCode}]");
                cb?.Invoke(newKeyCode);
            }
        }
    }

    2、MainActivity.cs

    //按键事件发布者
    MyKeyEventPublish myKeyEventPublish;
    protected override void OnCreate(Bundle savedInstanceState)
    {
        //实例化按键事件发布者
        myKeyEventPublish = new MyKeyEventPublish();
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;
    
        base.OnCreate(savedInstanceState);
    
        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
                    
        LoadApplication(new App(myKeyEventPublish));
    }
    
    public override bool OnKeyDown([GeneratedEnum]Keycode keyCode, KeyEvent e)
    {
        //键值更改事件发布方法
        myKeyEventPublish.OnKeyDown((int)keyCode);
    
        //switch (keyCode)
        //{
        //    case Keycode.VolumeUp:
        //        Message.ShortAlert("音量上");
        //        break;
        //    case Keycode.VolumeDown:
        //        Message.ShortAlert("音量下");
        //        break;
        //    default:break;
        //}
    
        return true;//屏蔽按键原有功能
        //return base.OnKeyDown(keyCode, e);//不屏蔽原有功能
    }

    3、App.cs

    namespace NetworkAssistant
    {
        public partial class App : Application
        {
            public App(MyKeyEventPublish myKeyEventPublish)
            {
                InitializeComponent();
    
                MainPage = new MainPage(myKeyEventPublish);
            }
    
            protected override void OnStart()
            {
                // Handle when your app starts
            }
    
            protected override void OnSleep()
            {
                // Handle when your app sleeps
            }
    
            protected override void OnResume()
            {
                // Handle when your app resumes
            }
        }
    }

    4、MainPage.cs

    //按键事件发布者
    MyKeyEventPublish myKeyEventPublish;
    //按键事件接收者
    MyKeyEventSubscribe myKeyEventSubscribe;
    public MainPage(MyKeyEventPublish mkp)
    {
        //实例化按键事件发布者
        myKeyEventPublish = mkp;
        //实例化按键事件接收者
        myKeyEventSubscribe = new MyKeyEventSubscribe(OnKeyDownCallBack);
        //增加订阅
        myKeyEventPublish.OnKeyDown += myKeyEventSubscribe.OnKeyDown;
    
        InitializeComponent();
    }
    void OnKeyDownCallBack(int keyCode)
    {
    if (keyCode == 24) {//音量键上 //Message.ShortAlert("音量键上"); SendData("VU"); } else if (keyCode == 25) {//音量键下 //Message.ShortAlert("音量键下"); SendData("VD"); } Console.WriteLine("按键按下:"+keyCode); }

    欢迎讨论,非常感谢

  • 相关阅读:
    file类中,命令记录
    Java中有多个异常, 如何确定捕获顺序(多个catch),先从上到下执行,判断异常的大小,如果包含捕到异常,就进入这个catch,后面的就不再执行
    try....fail....catch...Assert 模式的测试, fail是Junit中的功能
    java.io.FileNotFoundException异常,一是“拒绝访问”,二是“系统找不到指定路径”
    [1]IP地址查询
    支付宝地铁SDK使用失败记录
    食神
    【初等数论】 04
    【初等数论】 03
    【初等数论】 02
  • 原文地址:https://www.cnblogs.com/sethnie/p/11332571.html
Copyright © 2020-2023  润新知