• xml布局显示需要预判断,可是还没有show出来,怎么办?


    最近在实际工作中遇到了一种情况,写一个音量条,音量条显示出来之前要判断系统的音量大小,然后给音量条设置显示的位置。解决办法有两种,

    第一种:    m_pHostThread>MsgAsyncCall(MSG_METHOD(this,speakeMuteBtnHandler::onVolumeBarChanged));在onVolumeBarChanged函数中,把你当前的音量设置到系统中,实现onVolumeBarChanged函数。

    1 BOOL speakeMuteBtnHandler::onVolumeBarChanged(msgObject&)
    2 {
    3     xSliderHandler* sliderHandler = m_pHostView->viewAt<xView>("volumeBar").findHandler<xSliderHandler>();
    4     chASSERT(sliderHandler != NULL);
    5     int volume = devGetTalkVolume();
    6     sliderHandler->setValue(toString(volume));
    7     return TRUE;
    8 }

        在这个函数中,先将布局取到,m_pHostView指的是当前整个的布局,通过m_pHostView拿到 id为volumebar的音量条布局,在这个里面取出SliderHandler,判断当前音量条的位置,设置音量。

    第二种:

    把整个的次级菜单,封装进一个sliderHandler的类,这类可以继承xLinearLayout或者其他布局中需要的类,在类内,将这个布局文件加载出来,加载出来以后,取出对象,设置音量。

    这里写一下音量条的联动:

          

     1 void speakeMuteBtnHandler::onViewConnected()
     2 {
     3     m_pSpeakeMuteBtn = &m_pHostView->viewAt<xView>("speakeMuteBtn");
     4     slotSpeakeMuteBtn();
     5     msgJoinMessageGroup(szVolumeGroupName, MSG_METHOD(this, speakeMuteBtnHandler::onSpeakeMuteChanged));
     6     SLOT_CONNECT(m_pSpeakeMuteBtn, signalClicked, this, speakeMuteBtnHandler::slotSpeakeMuteBtnClicked);
     7     xSliderHandler* sliderHandler = m_pHostView->viewAt<xView>("volumeBar").findHandler<xSliderHandler>();
     8     chASSERT(sliderHandler != NULL);
     9     SLOT_CONNECT(sliderHandler, signalValueChanged, this, speakeMuteBtnHandler::slotVolumeBarChanged);
    10     m_pHostThread->MsgAsyncCall(MSG_METHOD(this, speakeMuteBtnHandler::onVolumeBarChanged));
    11 };

         onViewConnected这个函数只加载一次,slotSpeakeMUteBtn是要初始化一次,这个函数的实现是:

     1 void speakeMuteBtnHandler::slotSpeakeMuteBtn()
     2 {
     3     xImageView& icon = m_pSpeakeMuteBtn->viewAt<xImageView>("icon");
     4     if (devGetOutputSilence())
     5     {
     6         icon.setPixmap("talk/softkey/silence.png");
     7     }
     8     else
     9     {
    10         icon.setPixmap("talk/softkey/volume-mute-btn-normal.png");
    11     }
    12 };

       判断当前是否静音,设置图标状态。

     1 BOOL speakeMuteBtnHandler::onSpeakeMuteChanged(msgObject& msgObj)
     2 {
     3     xImageView& icon = m_pSpeakeMuteBtn->viewAt<xImageView>("icon");
     4     switch (msgObj.message)
     5     {
     6     case VOLUME_OUTPUT_MUTE_CHANGED:
     7         slotSpeakeMuteBtn();
     8         break;
     9     default:
    10         return FALSE;
    11     }
    12     return TRUE;
    13 };

     监听组播消息,这里的组播是线程通信的一种,其他地方有设置静音,这里进行监听,进行相应的UI修改。

    1 void speakeMuteBtnHandler::slotSpeakeMuteBtnClicked(chSignal* /*sender*/, WPARAM /*wParam*/, LPARAM /*lParam*/, int /*nDataBytes*/, LPVOID /*pData*/)
    2 {
    3     devSetOutputSilence(!devGetOutputSilence());
    4 };

    调用静音接口函数。

    1 void speakeMuteBtnHandler::slotVolumeBarChanged(chSignal* /*sender*/, WPARAM wParam, LPARAM /*lParam*/, int /*nDataBytes*/, LPVOID /*pData*/)
    2 {
    3     xSliderHandler* sliderHandler = m_pHostView->viewAt<xView>("volumeBar").findHandler<xSliderHandler>();
    4     int volume = 0;
    5     toValue(sliderHandler->value, volume);
    6     devSetTalkVolume(volume);
    7 };

    根据滚动条的变化来设置音量。

  • 相关阅读:
    技术的极限(8): 集成与分离
    心智与认知(1): 反馈循环(Feedback loop)
    证明与计算(6): 身份认证与授权
    证明与计算(5): 从加密哈希函数到一致性哈希
    技术的极限(6): 密码朋克精神(Cypherpunk Spirit)
    翻译(3): NULL-计算机科学上最糟糕的失误
    工具(5): 极简开发文档编写(How-to)
    证明与计算(3): 二分决策图(Binary Decision Diagram, BDD)
    证明与计算(2): 离散对数问题(Discrete logarithm Problem, DLP)
    翻译(2): How to Write a 21st Century Proof
  • 原文地址:https://www.cnblogs.com/132818Creator/p/7200659.html
Copyright © 2020-2023  润新知