欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Xamarin Android 监听音量键(下)

程序员文章站 2023-11-23 16:03:58
Xamarin Android 开发,获取按键状态,并利用publish-subscribe模式通知到子界面。 ......

上篇在 mainactivity 中重写了按键事件(onkeydown),获取了音量键键值并打印了出来,当然,手机物理按键和虚拟按键(音量键、返回键、菜单键等)均可通过该按键事件被捕获。

 

但是,按键重写在 mainactivity 中,音量键按下时执行的方法在其他页面中。

 

作者冒出了一个不成熟的想法:利用(publish-subscribe)模式,在 mainactivity 中定义发布者(publish),实例化后层层传递到达 我的页面中,,再将实例化后的订阅者(subscribe)连接上。如图从左到右依次为类实例化的顺序:

Xamarin Android 监听音量键(下)

方案实现:

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

 

欢迎讨论,非常感谢