支持手势的Windows Mobile工具条

htc touch diamond 的图片管理器有一个可左右伸缩的工具条,用起来很方便 (图 1)。现在我们来实现一个可左右伸缩又支持手势的工具条 (图 2)。

htc touch diamond toolbox

toolbox with gesture support

图 1. htc touch diamond 的图片管理器

图 2. toolbox with gesture support,效果图

绘制工具条

我们简单地新建一个用户控件,添加图片框作为图标按钮,再把它添加到主窗口。在窗口初始化处设置工具条高度和位置。

 

public Form1()
{
    InitializeComponent();

    //set the tool box to dock right
    toolbox.Height = this.Height;
    toolbox.Location = new Point(this.Width, 0);
}

 

 

HTC G-Sensor

HTC G-Sensor,加速度感应器,又叫重力感应器。由于它比较小巧,可以内嵌到其它设备中。现在很多智能手机都有 G-Sensor,比较常见的有 HTC 和 Samsun。本文的例子是使用 HTC  的 G-Sensor。

现在 HTC 上G-Sensor 的三维数据精度已经达到了双精度。由G-Sensor 可以开发出很多很有趣的重力感应游戏,比如 Resco Snake。

下面我们就来介绍如何访问 HTC 的G-Sensor。

网上有现成的控件(c#)直接调用,或者可以参照 codeplex 上的 sensor api。由不同库封装得到的数据不一样,但都可以进行简单的比例转换就可以得到相同的数据。我们选用accelerometer.dll。

 

 HTCGSensor gsensor = new HTCGSensor();//Initialize a HTCGSensor object to access htc g-sensor
 GVector vector = gsensor.GetGVector();//call GetGVector() method to get a current GVector

为了得到连续的数据,我们在一个 timer 里调用GetGVector()。

GVector 是一个结构体,用来表示一个受力状态,原型如下:

public double Length { get; }//加速度大小
public double X { get; set; }//加速度X轴分量大小
public double Xangle { get; set; }//加速度X轴分量与水平面夹角
public double Y { get; set; }//加速度Y轴分量大小 
public double Yangle { get; set; }//加速度Y轴分量与水平面夹角
public double Z { get; set; }//加速度Z轴分量大小

下面两张图片是两个状态的演示(来自codeplex):

clip_image002

竖直放置,x,y,z 分量分别为:0, -9.8, 0

clip_image004

水平放置,x,y,z 分量分别为:0, 0, -9.8

手势

>我们先监视值小于2的X,置 定义手势 Shack left:手机正面正对着用户,往左摇一下。Shack right 类似。我们从G-Sensor 读取的数据来判断手势,取样频率 20Hz。这里只判断 X 轴的分量,数据用 excel 绘出图来:

public static void FeedData(double x, double y, double z, double length, double xAngle, double yAngle)
           {
             if (state == 0)
               {
                 if (Math.Abs(x) <= 2)
                   {
                     firstPointTime = DateTimeEx.Now;
                     state = 1;
                 }
             }
             else if (state == 1)
               {
                 if (Math.Abs(x) >= 5 && Math.Abs(x) <= 15)
                   {
                     secondPointTime = DateTimeEx.Now;
                     int span = (secondPointTime - firstPointTime).Milliseconds;
                     if (span >= SPAN_MIN && span <= SPAN_MAX)
                       {
                         if (x < 0 && ShackLeft != null)
                             ShackLeft(null, null);// notify shack left
                         else if (x > 0 && ShackRight != null)
                             ShackRight(null, null);// notify shack right
                     }
                     state = 0;
                 }
             }
         }

小结

这里,我们结合 G-Sensor 来完成对一个工具条的控制,比较新颖,控制起来也比普通的模式有乐趣。手势判断比较简单,也可以自己分析数据,再写一个不同的手势处理,比如甩两下,就触发某一动作。

共有0个回答