<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://interop123.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang=""><title type="html">桂超的博客</title><subtitle type="html">这是我在 interop123  社区上的技术社区，希望我的文章能够对大家有帮助:)</subtitle><id>http://interop123.com/blogs/huangguichao/atom.aspx</id><link rel="alternate" type="text/html" href="http://interop123.com/blogs/huangguichao/default.aspx" /><link rel="self" type="application/atom+xml" href="http://interop123.com/blogs/huangguichao/atom.aspx" /><generator uri="http://communityserver.org" version="2.1.61120.2">Community Server</generator><updated>2009-11-05T15:51:00Z</updated><entry><title>支持手势的 Windows Mobile 工具条</title><link rel="alternate" type="text/html" href="http://interop123.com/blogs/huangguichao/archive/2009/11/05/windows-mobile.aspx" /><id>http://interop123.com/blogs/huangguichao/archive/2009/11/05/windows-mobile.aspx</id><published>2009-11-05T07:51:00Z</published><updated>2009-11-05T07:51:00Z</updated><content type="html">&lt;BLOCKQUOTE&gt;
&lt;P&gt;htc touch diamond 的图片管理器有一个可左右伸缩的工具条，用起来很方便 (图 1)。现在我们来实现一个可左右伸缩又支持手势的工具条 (图 2)。&lt;/P&gt;
&lt;TABLE cellSpacing=0 cellPadding=2&gt;

&lt;TR&gt;
&lt;TD&gt;
&lt;P align=center&gt;&lt;A href="http://images.cnblogs.com/cnblogs_com/Doho/WindowsLiveWriter/WindowsMobile_C675/image_2.png" target=_blank&gt;&lt;IMG style="BORDER-RIGHT-WIDTH:0px;DISPLAY:inline;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;MARGIN-LEFT:0px;BORDER-LEFT-WIDTH:0px;MARGIN-RIGHT:0px;" title="htc touch diamond toolbox" border=0 alt="htc touch diamond toolbox" src="http://images.cnblogs.com/cnblogs_com/Doho/WindowsLiveWriter/WindowsMobile_C675/image_thumb.png" width=184 height=244&gt;&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P align=center&gt;&lt;A href="http://images.cnblogs.com/cnblogs_com/Doho/WindowsLiveWriter/WindowsMobile_C675/image_4.png" target=_blank&gt;&lt;IMG style="BORDER-RIGHT-WIDTH:0px;DISPLAY:block;FLOAT:none;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;MARGIN-LEFT:auto;BORDER-LEFT-WIDTH:0px;MARGIN-RIGHT:auto;" title="toolbox with gesture support" border=0 alt="toolbox with gesture support" src="http://images.cnblogs.com/cnblogs_com/Doho/WindowsLiveWriter/WindowsMobile_C675/image_thumb_1.png" width=184 height=244&gt;&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P align=center&gt;图 1. htc touch diamond 的图片管理器&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P align=center&gt;图 2. toolbox with gesture support，效果图&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/BLOCKQUOTE&gt;
&lt;H2&gt;绘制工具条&lt;/H2&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;我们简单地新建一个用户控件，添加图片框作为图标按钮，再把它添加到主窗口。在窗口初始化处设置工具条高度和位置。&lt;A href="http://images.cnblogs.com/cnblogs_com/Doho/WindowsLiveWriter/WindowsMobile_C675/image_6.png" target=_blank&gt;&lt;IMG style="BORDER-BOTTOM:0px;BORDER-LEFT:0px;DISPLAY:inline;MARGIN-LEFT:0px;BORDER-TOP:0px;MARGIN-RIGHT:0px;BORDER-RIGHT:0px;" title=image border=0 alt=image align=right src="http://images.cnblogs.com/cnblogs_com/Doho/WindowsLiveWriter/WindowsMobile_C675/image_thumb_2.png" width=183 height=244&gt;&lt;/A&gt; &lt;/P&gt;
&lt;DIV class=cnblogs_code&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Form1()
{
    InitializeComponent();

    &lt;SPAN class=rem&gt;//set the tool box to dock right&lt;/SPAN&gt;
    toolbox.Height = &lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt;.Height;
    toolbox.Location = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Point(&lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt;.Width, 0);
}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;HTC G-Sensor&lt;/H2&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;HTC &lt;A href="http://baike.baidu.com/view/1551035.html" target=_blank&gt;G-Sensor&lt;/A&gt;，加速度感应器，又叫重力感应器。由于它比较小巧，可以内嵌到其它设备中。现在很多智能手机都有 G-Sensor，比较常见的有 HTC 和 Samsun。本文的例子是使用 HTC&amp;nbsp; 的 G-Sensor。&lt;/P&gt;
&lt;P&gt;现在 HTC 上G-Sensor 的三维数据精度已经达到了双精度。由G-Sensor 可以开发出很多很有趣的重力感应游戏，比如 &lt;A href="http://www.resco.net/company/press/releases/2009-07-16.htm" target=_blank&gt;Resco Snake&lt;/A&gt;。&lt;/P&gt;
&lt;P&gt;下面我们就来介绍如何访问 HTC 的G-Sensor。&lt;/P&gt;
&lt;P&gt;网上有现成的控件（c#）直接调用，或者可以参照 codeplex 上的 &lt;A href="http://sensorapi.codeplex.com/" target=_blank&gt;sensor api&lt;/A&gt;。由不同库封装得到的数据不一样，但都可以进行简单的比例转换就可以得到相同的数据。我们选用accelerometer.dll。&lt;/P&gt;&lt;PRE class=csharpcode&gt;&lt;DIV class=cnblogs_code&gt;&lt;IMG alt="" align=top src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif"&gt;&lt;SPAN style="COLOR:#000000;"&gt;HTCGSensor&amp;nbsp;gsensor&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:#000000;"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR:#000000;"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:#0000ff;"&gt;new&lt;/SPAN&gt;&lt;SPAN style="COLOR:#000000;"&gt;&amp;nbsp;HTCGSensor();&lt;/SPAN&gt;&lt;SPAN style="COLOR:#008000;"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR:#008000;"&gt;Initialize&amp;nbsp;a&amp;nbsp;HTCGSensor&amp;nbsp;object&amp;nbsp;to&amp;nbsp;access&amp;nbsp;htc&amp;nbsp;g-sensor&lt;/SPAN&gt;&lt;SPAN style="COLOR:#008000;"&gt;&lt;BR&gt;&lt;IMG alt="" align=top src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:#000000;"&gt;GVector&amp;nbsp;vector&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR:#000000;"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR:#000000;"&gt;&amp;nbsp;gsensor.GetGVector();&lt;/SPAN&gt;&lt;SPAN style="COLOR:#008000;"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR:#008000;"&gt;call&amp;nbsp;GetGVector()&amp;nbsp;method&amp;nbsp;to&amp;nbsp;a&amp;nbsp;current&amp;nbsp;GVector&lt;/SPAN&gt;&lt;SPAN style="COLOR:#008000;"&gt;&lt;BR&gt;&lt;IMG alt="" align=top src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif"&gt;&lt;/SPAN&gt;&lt;/DIV&gt;为了得到连续的数据，我们在一个 timer 里调用GetGVector()。&lt;/PRE&gt;&lt;PRE class=csharpcode&gt;GVector 是一个结构体，用来表示一个受力状态，原型如下：&lt;/PRE&gt;&lt;PRE class=csharpcode&gt;&lt;DIV class=cnblogs_code&gt;&lt;SPAN style="DISPLAY:none;" id=Code_Open_Text_155441&gt;&lt;SPAN style="COLOR:#008000;"&gt;
&lt;PRE class=csharpcode&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;double&lt;/SPAN&gt; Length { get; }&lt;SPAN class=rem&gt;//加速度大小&lt;/SPAN&gt;
&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;double&lt;/SPAN&gt; X { get; set; }&lt;SPAN class=rem&gt;//&lt;/SPAN&gt;加速度X轴分量大小
&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;double&lt;/SPAN&gt; Xangle { get; set; }&lt;SPAN class=rem&gt;//&lt;/SPAN&gt;加速度X轴分量与水平面夹角&lt;/PRE&gt;
&lt;PRE class=csharpcode&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;double&lt;/SPAN&gt; Y { get; set; }&lt;SPAN class=rem&gt;//&lt;/SPAN&gt;加速度Y轴分量大小 
&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;double&lt;/SPAN&gt; Yangle { get; set; }&lt;SPAN class=rem&gt;//&lt;/SPAN&gt;加速度Y轴分量与水平面夹角
&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;double&lt;/SPAN&gt; Z { get; set; }&lt;SPAN class=rem&gt;//&lt;/SPAN&gt;加速度Z轴分量大小&lt;BR&gt;&lt;IMG alt="" align=top src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif"&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt; 下面两张图片是两个状态的演示（来自codeplex）：&lt;/PRE&gt;
&lt;TABLE cellSpacing=0 cellPadding=0&gt;

&lt;TR&gt;
&lt;TD&gt;
&lt;P&gt;&lt;A href="http://images.cnblogs.com/cnblogs_com/Doho/WindowsLiveWriter/WindowsMobile_C675/clip_image002_2.jpg" target=_blank&gt;&lt;IMG style="BORDER-BOTTOM:0px;BORDER-LEFT:0px;DISPLAY:inline;BORDER-TOP:0px;BORDER-RIGHT:0px;" title=clip_image002 border=0 alt=clip_image002 src="http://images.cnblogs.com/cnblogs_com/Doho/WindowsLiveWriter/WindowsMobile_C675/clip_image002_thumb.jpg" width=244 height=244&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;竖直放置，x,y,z 分量分别为:0, -9.8, 0&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;A href="http://images.cnblogs.com/cnblogs_com/Doho/WindowsLiveWriter/WindowsMobile_C675/clip_image004_2.jpg" target=_blank&gt;&lt;IMG style="BORDER-BOTTOM:0px;BORDER-LEFT:0px;DISPLAY:inline;BORDER-TOP:0px;BORDER-RIGHT:0px;" title=clip_image004 border=0 alt=clip_image004 src="http://images.cnblogs.com/cnblogs_com/Doho/WindowsLiveWriter/WindowsMobile_C675/clip_image004_thumb.jpg" width=244 height=244&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;水平放置，x,y,z 分量分别为:0, 0, -9.8&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/BLOCKQUOTE&gt;
&lt;H2&gt;手势&lt;/H2&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;定义手势 Shack left:手机正面正对着用户，往左摇一下。Shack right 类似。我们从G-Sensor 读取的数据来判断手势，取样频率 20Hz。这里只判断 X 轴的分量，数据用 excel 绘出图来：&lt;/P&gt;
&lt;P&gt;&lt;A href="http://images.cnblogs.com/cnblogs_com/Doho/WindowsLiveWriter/WindowsMobile_C675/image_12.png" target=_blank&gt;&lt;IMG style="BORDER-BOTTOM:0px;BORDER-LEFT:0px;DISPLAY:inline;MARGIN-LEFT:0px;BORDER-TOP:0px;MARGIN-RIGHT:0px;BORDER-RIGHT:0px;" title=image border=0 alt=image align=right src="http://images.cnblogs.com/cnblogs_com/Doho/WindowsLiveWriter/WindowsMobile_C675/image_thumb_5.png" width=369 height=185&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;我们先监视值小于2的X，置状态为1，接着监视在 5~15 范围内的X，再置状态为0，完成一个往左甩的手势。为了消除抖动，我们加入了时间判断，即一个手势的时间范围为 10~500 毫秒。程序如下:&lt;/P&gt;&lt;PRE class=csharpcode&gt;&lt;PRE class=csharpcode&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; FeedData(&lt;SPAN class=kwrd&gt;double&lt;/SPAN&gt; x, &lt;SPAN class=kwrd&gt;double&lt;/SPAN&gt; y, &lt;SPAN class=kwrd&gt;double&lt;/SPAN&gt; z, &lt;SPAN class=kwrd&gt;double&lt;/SPAN&gt; length, &lt;SPAN class=kwrd&gt;double&lt;/SPAN&gt; xAngle, &lt;SPAN class=kwrd&gt;double&lt;/SPAN&gt; yAngle)
        {
            &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (state == 0)
            {
                &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (Math.Abs(x) &amp;lt;= 2)
                {
                    firstPointTime = DateTimeEx.Now;
                    state = 1;
                }
            }
            &lt;SPAN class=kwrd&gt;else&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (state == 1)
            {
                &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (Math.Abs(x) &amp;gt;= 5 &amp;amp;&amp;amp; Math.Abs(x) &amp;lt;= 15)
                {
                    secondPointTime = DateTimeEx.Now;
                    &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; span = (secondPointTime - firstPointTime).Milliseconds;
                    &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (span &amp;gt;= SPAN_MIN &amp;amp;&amp;amp; span &amp;lt;= SPAN_MAX)
                    {
                        &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (x &amp;lt; 0 &amp;amp;&amp;amp; ShackLeft != &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)
                            ShackLeft(&lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;);&lt;SPAN class=rem&gt;// notify shack left&lt;/SPAN&gt;
                        &lt;SPAN class=kwrd&gt;else&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (x &amp;gt; 0 &amp;amp;&amp;amp; ShackRight != &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)
                            ShackRight(&lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;);&lt;SPAN class=rem&gt;// notify shack right&lt;/SPAN&gt;
                    }
                    state = 0;
                }
            }
        }       &lt;/PRE&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;H2&gt;
&lt;DIV class=cnblogs_code&gt;小结&lt;/DIV&gt;&lt;/H2&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;这里,我们结合 G-Sensor 来完成对一个工具条的控制，比较新颖，控制起来也比普通的模式有乐趣。手势判断比较简单，也可以自己分析数据，再写一个不同的手势处理，比如甩两下，就触发某一动作。&lt;/P&gt;
&lt;P&gt;示例代码：&lt;A href="http://files.cnblogs.com/Doho/WMDemo.rar" target=_blank&gt;WMToolbox&lt;/A&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;img src="http://interop123.com/aggbug.aspx?PostID=44" width="1" height="1"&gt;</content><author><name>idoho</name><uri>http://interop123.com/members/idoho.aspx</uri></author><category term="Windows Mobile" scheme="http://interop123.com/blogs/huangguichao/archive/tags/Windows+Mobile/default.aspx" /><category term="toolbar" scheme="http://interop123.com/blogs/huangguichao/archive/tags/toolbar/default.aspx" /><category term="gusture" scheme="http://interop123.com/blogs/huangguichao/archive/tags/gusture/default.aspx" /></entry></feed>