因斯福论坛

帖子
查看: 15265|回复: 0

Windows Phone 7的外设和重力感应

[复制链接]
发表于 2011-11-29 18:46:15 | 显示全部楼层 |阅读模式
WindowsPhone 7 的外设
这里只介绍Windows Phone的收音机和震动功能。(参照传智博客的视频而写)
      Windows phone 7的收音机功能的实现
实现收音机功能首先需要引用这个名字空间:using Microsoft.Devices.Radio;
在实现收音机的功能之前,我们需要知道FMRadio是一个单例类,即它只有一个实例,因此它也为单例模式。我们不能再声明它的一个实例。
注:单例模式:单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
单例模式的唯一实例是Instance.它有以下属性:
CurrentRegion
设置收音机所在地区,目前只支持美国,日本和欧洲
Frequency
设置收音机的频率
PowerMode
设置收音机的电源模式,开(on)或关(off)
SignalStrength
表示收音机的信号强度
FMRadio 还有两个枚举:
RadioPowerMode
表示电源模式,有两个枚举值 ON和OFF。
RadioRegion
表示收音机所在地区,有三个枚举值: Europe, Japan和 UnitedStates.
下面我们来看看如何通过代码实现收音机的功能。
首先我们设置一个FMRadio的变量它就等于Instance实例
FMRadio myradio= FMRadio.Instance;
接着设置该变量(即FMRadio的实例)的电源模式为开(即打开收音机):
myradio.PowerMode = RadioPowerMode.On; //设置电源模式为开
之后还可以设置收音机的地区频率等:
myradio.CurrentRegion = RadioRegion.UnitedStates; //设置收音机所在地为US
myradio.Frequency = 100; //设置收音机的频率为100
设置完成以后以上便实现了一个收音机的基本功能。
    Windowsphone 7的振动实现
实现振动效果需要引用该命名空间
using Microsoft.Phone.Devices;
实现振动只需要一句话:
VibrateController.Default.Start(TimeSpan.FromSeconds(2));
这行代码表示振动以秒计(FromSeconds),振动两秒。同理还有FromDays, FromHours, FromMinutes等。
二.实现Windows Phone  7的重力感应
首先需要引用这个
Using Microsoft.Devices.Sensors;
接着我们实例化一个对象:
Accelerometer acc = new Accelerometer();
然后注册检测加速度变化的事件ReadingChanged:
acc.ReadingChanged+= new EventHandler<AccelerometerReadingEventArgs>(acc_ReadingChanged);//注册事件
                            acc.Start();//启动重力加速
上面代码的解释:当加速度发生改变时,便会出发ReadingChanged事件,但是由于调用事件的处理函数和当前运行的页面处于不同的线程(重力感应的事件处理函数在后台运行的),因此需要通过使用位于System.Windows.Deployment命名空间下的Dispatcher类,来调用位于当前页面线程的方法。具体代码如下:
void acc_ReadingChanged(object sender, AccelerometerReadingEventArgse)
        {
            this.Dispatcher.BeginInvoke(new accdelegete(ACCchanged),e);
        }
声明一个委托
public delegate void accdelegete (AccelerometerReadingEventArgs e);
声明一个委托的代理方法:
void  ACCchanged(AccelerometerReadingEventArgs e)
       {
//此处添加当加速度改变时要执行的代码(也就是想实现的功能)
            XtextBox.Text = e.X.ToString();//将x轴方向的重力感应数据赋给TextBox
            YtextBox.Text = e.Y.ToString();//将y轴方向的重力感应数据赋给TextBox
            ZtextBox.Text = e.Z.ToString();//将z轴方向的重力感应数据赋给TextBox
       }
这样便是实现了重力加速感应的应用。
注:关于BeginInvoke方法的解说(摘自MSDN)
《-----在 WPF 中,只有创建 DispatcherObject 的线程才能访问该对象。 例如,一个从主 UI 线程派生的后台线程不能更新在该 UI 线程上创建的 Button 的内容。 为了使该后台线程能够访问 Button 的 Content 属性,该后台线程必须将此工作委托给与该 UI 线程关联的 Dispatcher。 使用 Invoke 或 BeginInvoke 来完成此操作。 Invoke 是同步操作,而 BeginInvoke 是异步操作。 该操作将按指定的 DispatcherPriority 添加到 Dispatcher 的事件队列中。
BeginInvoke 是异步操作;因此,调用之后控制权会立即返回给调用对象。
BeginInvoke 返回一个 DispatcherOperation 对象,当委托位于事件队列中时,该对象可用于与委托进行交互。
由 BeginInvoke 返回的 DispatcherOperation 对象可以采用多种方式与指定的委托进行交互,例如:
当在事件队列中挂起执行时,更改委托的 DispatcherPriority
从事件队列中移除委托。
等待委托返回。
获取委托执行之后返回的值。
如果按同一个 DispatcherPriority 调用多个 BeginInvoke,将按调用发生的顺序执行它们。
如果对某个已关闭的 Dispatcher 调用 BeginInvoke,则返回的 DispatcherOperation 的状态属性将设置为 Aborted----》
所以根据以上的解说我们便对:
this.Dispatcher.BeginInvoke(newaccdelegete(ACCchanged), e);
这一行代码不陌生了。
由于我们要操作位于当前运行页面上的TextBox空间,所以后台的线程不能直接访问该TextBox的Text。因此必须交与和TextBox相关的线程即当前页面所处的线程来完成,所以我们选择BeginInvoke方法来完成该任务。
以上步骤微软在推出.NET3.5后还有新的写法,推荐这样使用。上面的代码可以这样写:
void acc_ReadingChanged(object sender, AccelerometerReadingEventArgse)
       {
          Deployment.Current.Dispatcher.BeginInvoke(()=> ACCchanged(e));
        }
        void ACCchanged(AccelerometerReadingEventArgse)
        {
            XtextBox.Text= e.X.ToString();
            YtextBox.Text= e.Y.ToString();
            ZtextBox.Text= e.Z.ToString();
        }
以上代码和之前使用委托的方法是一样的效果。
=>这个符号,本人不是很明白,求解!
回复

举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|因斯福论坛  

GMT+8, 2025-5-20 09:38

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表