上篇在 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); }
歡迎討論,非常感謝