Xamarin Android 监听音量键(下)
程序员文章站
2023-11-23 16:03:58
Xamarin Android 开发,获取按键状态,并利用publish-subscribe模式通知到子界面。 ......
上篇在 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"); } else { console.writeline("按键按下:"+keycode); } }
欢迎讨论,非常感谢