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 == )
- {//音量键上
- //Message.ShortAlert("音量键上");
- SendData("VU");
- }
- else if (keyCode == )
- {//音量键下
- //Message.ShortAlert("音量键下");
- SendData("VD");
- }
- Console.WriteLine("按键按下:"+keyCode);
- }
欢迎讨论,非常感谢
Xamarin Android 监听音量键(下)的更多相关文章
- xamarin Android 监听音量键(上)
public override bool OnKeyDown([GeneratedEnum]Android.Views.Keycode keyCode, KeyEvent e) { switch (k ...
- vs xamarin android 监听返回键退出程序
public override bool OnKeyDown([GeneratedEnum]Keycode keyCode, KeyEvent e) { if (keyCode == Keycode. ...
- Android监听返回键、Home键+再按一次返回键退出应用
Android监听返回键需重写onKeyDown()方法 Home键keyCode==KeyEvent.KEYCODE_HOME @Override public boolean onKeyDown( ...
- android 监听返回键
android监听返回键 public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE ...
- Android 监听返回键退出程序的两种实现
1.Android 双击返回键退出程序 思路:用户按下返回键时设定一个定时器来监控是否2秒内实现了退出,如果用户没有接着按返回键,则清除第一次按返回键的效果,使程序还原到第一次按下返回键之前的状态.定 ...
- Android 监听返回键、HOME键
拦截返回键,HOME键,继承BaseActivity即可 import android.app.Activity; import android.content.BroadcastReceiver; ...
- android 监听Home键
/** * Home 键监听,当按下Home键时,系统会发出action为Intent.ACTION_CLOSE_SYSTEM_DIALOGS的BroadcastReceiver * 在程序里动态注册 ...
- Android监听Home键
监听广播 ACTION_CLOSE_SYSTEM_DIALOGS private void registerHomeReceiver(){ IntentFilter homeFilter = new ...
- Android监听HOME键的最简单的方法
public static final int FLAG_HOMEKEY_DISPATCHED = 0x80000000; public void onCreate(Bundle savedInsta ...
随机推荐
- Docker-Compose搭建单体SkyWalking
SkyWalking简介 SkyWalking是一款高效的分布式链路追踪框架,对于处理分布式的调用链路的问题定位上有很大帮助 有以下特点: 性能好 针对单实例5000tps的应用,在全量采集的情况下, ...
- Ceph Plugin - Dashboard - By Anoyi
▶ 部署 Dashboard 1.安装 ceph-mgr-dashboard yum install -y ceph-mgr-dashboard 2.禁用 SSL ceph config set mg ...
- 使用Gitlab-CI 实现NetCore项目Docker化并部署到阿里云K8S
使用Gitlab-CI 实现NetCore项目Docker化并部署到阿里云K8S 先行条件: 1.了解NetCore项目基础命令,如dotnet publish 等几个常用命令. 2.了解Dock ...
- Linux系统下word转pdf,xls转pdf,ppt转pdf
word转换pdf的技术方案,供参考.[doc/docx/ppt/pptx/xls/xlsx均支持转换] 本方案是Java结合shell命令完成,不同于以往的仅依赖java组件转换 ...
- [POJ2942]Knights of the Round Table(点双+二分图判定——染色法)
建补图,是两个不仇恨的骑士连边,如果有环,则可以凑成一桌和谐的打麻将 不能直接缩点,因为直接缩点求的是连通分量,点双缩点只是把环缩起来 普通缩点 ...
- WinForm控件之【ListView】
基本介绍 项列表控件,拥有五种不同视图的样式供展示项集合. 常设置属性 Columns:‘详细信息’视图中用来显示的列: Groups:ListView列表中的组,将列表各项分组区域展示: Horiz ...
- 【超详细】vultr(CentOS7)+LNMP+WordPress 搭建个人博客
心血来潮想搭建个人博客,我的vps只用来搭ss未免太过浪费 在这里记录一下搭建个人博客的历程 0x00 写在前面 why vultr: 优点:便宜. 性能优良.按时间计费(不用包年 学生党的福音).稳 ...
- [LeetCode] 107 Binary Tree Level Order Traversal II (easy)
原题 层序遍历,从自底向上按层输出. 左→右→中 解法一 : DFS,求出自顶向下的,最后返回时反转一下. class Solution { public: vector<vector<i ...
- Cesium 学习(三)各种资源链接
1.前言 前面已经介绍如何获得以及安装部署Cesium,接下来分享下学习资源链接,其中访问最多的是官网以及超图.火星的demo网站. 2.官网地址及介绍 官网:https://cesiumjs.org ...
- 【Arduino】66种传感器系列实验(1)---干簧管传感器模块
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和各种模块,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里 ...