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); }

 

歡迎討論,非常感謝

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM