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");
    }
    else
    {
        Console.WriteLine("按键按下:"+keyCode);
    }
}

欢迎讨论,非常感谢

原文地址:https://www.cnblogs.com/sethnie/p/11332571.html

时间: 2024-11-07 22:58:18

Xamarin Android 监听音量键(下)的相关文章

vs xamarin android 监听返回键退出程序

public override bool OnKeyDown([GeneratedEnum]Keycode keyCode, KeyEvent e) { if (keyCode == Keycode.Back) { Finish(); System.Environment.Exit(0); } return base.OnKeyDown(keyCode, e); } 在activity中重写OnKeyDown监听.

Android监听HOME键的最简单的方法

public static final int FLAG_HOMEKEY_DISPATCHED = 0x80000000; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.getWindow().setFlags(FLAG_HOMEKEY_DISPATCHED, FLAG_HOMEKEY_DISPATCHED);//关键代码 setContentView(R.la

android 监听返回键

android监听返回键 public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { return true; } return super.onKeyDown(keyCode, event); } event.getRepeatCount() == 0重复次数:1次

Android监听返回键、Home键+再按一次返回键退出应用

Android监听返回键需重写onKeyDown()方法 Home键keyCode==KeyEvent.KEYCODE_HOME [java] view plain copy @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { //++自定义点击事件 return tru

Android 监听Home键

游戏需要统计用户退出游戏是按的返回键还是home,因为返回键是自己cocos2dx做的监听,所以这里说一下android Activity里监听Home键方法,亲测可用,这里做个备份其中也是参考别人的代码实现的,路径没有记住,如有雷同,望见谅-- 这里使用的是广播的形式监听Home操作的方法: 首先在MainActivity里添加如下广播,生成一个成员变量:  private final BroadcastReceiver homeReceiver = new BroadcastReceiver

Android 监听返回键退出程序的两种实现

1.Android 双击返回键退出程序 思路:用户按下返回键时设定一个定时器来监控是否2秒内实现了退出,如果用户没有接着按返回键,则清除第一次按返回键的效果,使程序还原到第一次按下返回键之前的状态.定时器是每次用户按下返回键才去创建. 代码如下: /** * 菜单.返回键响应 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if(keyC

Android监听Home键的完美解决方案

相信有不少朋友在开发过程中需要监听HOME键的需求,现本人将代码奉上,希望对大家有所帮助! import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; public class HomeWatcher { private static final String TAG = "

Android 监听音量加减

/** * 监听音量加减 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_DOWN: Toast.makeText(MainActivity.this, "减", Toast.LENGTH_SHORT).show(); break; case KeyEvent.KEYCODE_VOLUME_UP: To

Android监听home键

/** * * 监听Home键 */ private BroadcastReceiver mHomeKeyEventReceiver = new BroadcastReceiver() { String SYSTEM_REASON = "reason"; String SYSTEM_HOME_KEY = "homekey"; String SYSTEM_HOME_KEY_LONG = "recentapps"; @Override public