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

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

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

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

第二种:

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

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

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

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

 void speakeMuteBtnHandler::slotSpeakeMuteBtn()
{
xImageView& icon = m_pSpeakeMuteBtn->viewAt<xImageView>("icon");
if (devGetOutputSilence())
{
icon.setPixmap("talk/softkey/silence.png");
}
else
{
icon.setPixmap("talk/softkey/volume-mute-btn-normal.png");
}
};

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

 BOOL speakeMuteBtnHandler::onSpeakeMuteChanged(msgObject& msgObj)
{
xImageView& icon = m_pSpeakeMuteBtn->viewAt<xImageView>("icon");
switch (msgObj.message)
{
case VOLUME_OUTPUT_MUTE_CHANGED:
slotSpeakeMuteBtn();
break;
default:
return FALSE;
}
return TRUE;
};

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

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

调用静音接口函数。

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

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

xml布局显示需要预判断,可是还没有show出来,怎么办?的更多相关文章

  1. Android Studio无法预览xml布局之解决方法(两种)

    学习安卓程序开发,用的Android Studio,发现怎么更改xml代码都没有想要的效果.如图 代码如下: <?xml version="1.0" encoding=&qu ...

  2. 仿酷狗音乐播放器开发日志二十四 选项设置窗体的实现(附328行xml布局源码)

    转载请说明原出处,谢谢~~ 花了两天时间把仿酷狗的选项设置窗体做出来了,当然了只是做了外观.现在开学了,写代码的时间减少,所以整个仿酷狗的工程开发速度减慢了.今天把仿酷狗的选项设置窗体的布局代码分享出 ...

  3. Android中measure过程、WRAP_CONTENT详解以及 xml布局文件解析流程浅析

    转自:http://www.uml.org.cn/mobiledev/201211221.asp 今天,我着重讲解下如下三个内容: measure过程 WRAP_CONTENT.MATCH_PAREN ...

  4. 第五篇:在SOUI中使用XML布局属性指引(pos, offset, pos2type)

    窗口布局的概念 每一个UI都是由大量的界面元素构成的,在Windows编程,这些界面元素的最小单位通常称之为控件. 布局就是这些控件在主界面上的大小及相对位置. 传统的布局一般使用一个4个绝对坐标来定 ...

  5. android xml布局文件属性说明

    android xml布局文件属性说明 [摘]android xml布局文件属性说明 LinearLayout和RelativeLayout 共有属性:java代码中通过btn1关联次控件androi ...

  6. 使用XML布局文件和Java代码混合控制UI界面

    完全使用Java代码来控制UI界面不仅烦琐.而且不利于解耦:而完全利用XML布局文件来控制UI界面虽然方便.便捷,但难免有失灵活.因此有些时候,可能需要混合使用XML布局文件和代码来控制UI界面. 当 ...

  7. android 开发 使用自定义布局实现标题栏复用(标题栏内容自定义:使用代码实现和xml布局自定义属性2种办法实现)

    在个人学习的情况下可能很少使用自定义布局去实现大量复用的情况下,但是在一个开发工作的环境下就会使用到大量复用的自定义控件. 实现思维: 1.写一个xml的布局,用于标题栏的样式,并且添加在标题栏中你想 ...

  8. 安卓app开发-05-Android xml布局详细介绍

    安卓app开发-05-Android xml布局详细介绍 虽然说有 墨刀,墨客 这些图形化开发工具来做 Android 的界面设计,但是我们还是离不开要去学习做安卓原生app,学习 xml 布局还是必 ...

  9. XML布局文件于Java代码使用问题

    2013-9-21 问题一.不同的XML文件中相同类型的控件id相同,那么将这些不同的布局xml组合在一个大的布局中,如何解决相同id问题 ? 解决办法: 不同的布局文件XML要组合成一个新的大布局, ...

随机推荐

  1. C#反射动态调用dll中的方法,并返回结果(转)

    反射的作用是动态的加载某个dll(程序集),并执行该程序集中的某个方法,并返回结果:当然也可以给该方法传递参数 namespace assembly_name { public class assem ...

  2. (转)MySQL Proxy使用

    转自: http://www.cnblogs.com/itech/archive/2011/09/22/2185365.html http://koda.iteye.com/blog/788862 h ...

  3. Oracle Profile文件

    一.Profile文件概述:Profiles是Oracle安全策略的一个组成部分,当Oracle建立数据库时,会自动建立名称为Default的profile,当建立用户没有指定profile,那么or ...

  4. dll和so文件区别与构成

    http://www.cnblogs.com/likwo/archive/2012/05/09/2492225.html 动态链接,在可执行文件装载时或运行时,由操作系统的装载程序加载库.大多数操作系 ...

  5. c# Time类

    直接上代码 public KBehaviour() { //间隔时间 System.Timers.Timer t = ); t.Elapsed += new System.Timers.Elapsed ...

  6. MySQL操作汇总

    这学期学习了数据库系统原理,做了实验,mark一记. T—SQL的简单查询.连接查询 (1)用SQL语句建库.建表并插入记录. 建库: 建表: 插入记录: 查看 (2)修改表结构,包括修改属性列的数据 ...

  7. 完美解决ExtJs6上传中文文件名乱码,后端SpringMVC

    ExtJs上传中文文件名乱码,观察请求. ExtJs6上传乱码从后台无法解决,因为文件名请求里面就已经乱码了,后台无法解码. 除非请求参数正确没有乱码,后台因为编码设置不一样,可以通过后台处理乱码 这 ...

  8. liunx下在线升级python到2.7版本

    因开发nodejs中间用到了node-gyp模块,此模块需2.X最新版本,所以升级服务器python版本 亲测成功 python 升级步骤#1.which python 查询python的位置/usr ...

  9. Bookstrap4 学习(一)

    容器 container 是最基本的lagyout 元素, 并且当使用默认的Grid 系统时, containers 是必须的. <div class="container" ...

  10. nginx+nodejs+mysql+memcached服务器后台架设centos6.5

    需要的下面四个工具最好都采用yum安装,不要采用编译安装的方法,因为编译安装会导致某些依赖关系丢失. nginx 作为HTTP和反向代理,处理静态页面,动态服务交由nodejs服务. nodejs作为 ...