当前位置: 移动技术网 > IT编程>移动开发>Android > Xamarin Android 监听音量键(下)

Xamarin Android 监听音量键(下)

2019年08月11日  | 移动技术网IT编程  | 我要评论

误惹撒旦冷殿下,性追缉令,泰民我们结婚了停拍

上篇在 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);
    }
}

 

欢迎讨论,非常感谢

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网