热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

元宵快乐

博客园的小伙伴们,新年好啊。春节刚过,元宵又至。不知大家所在之处是否还有看花灯,猜灯谜的传统呢?应此情此景,我

博客园的小伙伴们,新年好啊。

春节刚过,元宵又至。不知大家所在之处是否还有看花灯,猜灯谜的传统呢?应此情此景,我们依托微软亚洲研究院自然语言计算组的研究成果,为大家带来了UAP版本的微软字谜APP:

Windows Phone Store地址 : 微软字谜

就算没有时间去看灯,也可以在手机上体验一把文艺范。

在微软字谜中,你可以闯过323关,一展聪明才智;可以用APP帮你出字谜给小伙伴猜,让他们也死几个脑细胞;还能上传原创字谜,与大家同乐。

与之前一样,接下来和大家分享下开发中的有意思的地方:

主页

主页沿用了微软对联的形式,加入了3个小动画:

灯笼翻转:

<Storyboard x:Name&#61;"sb_LanternRotate" Completed&#61;"sb_LanternRotate_Completed">

<DoubleAnimation Storyboard.TargetName&#61;"img_Lantern" Storyboard.TargetProperty&#61;"(UIElement.Projection).(PlaneProjection.RotationY)"

From&#61;"0" To&#61;"360" Duration&#61;"0:0:1"/>

<DoubleAnimation Storyboard.TargetName&#61;"img_Lantern" Storyboard.TargetProperty&#61;"Opacity"

From&#61;"0" To&#61;"1" Duration&#61;"0:0:1"/>

Storyboard>

菜单转动&#xff1a;

<Storyboard x:Name&#61;"sb_Menu" Completed&#61;"sb_Menu_Completed">

<DoubleAnimation Storyboard.TargetName&#61;"menu_Guess" Storyboard.TargetProperty&#61;"(UIElement.Projection).(PlaneProjection.RotationX)"

From&#61;"90" To&#61;"0" Duration&#61;"0:0:0.20" BeginTime&#61;"0:0:0.20"/>

<DoubleAnimation Storyboard.TargetName&#61;"menu_Produce" Storyboard.TargetProperty&#61;"(UIElement.Projection).(PlaneProjection.RotationX)"

From&#61;"90" To&#61;"0" Duration&#61;"0:0:0.20" BeginTime&#61;"0:0:0.40"/>

<DoubleAnimation Storyboard.TargetName&#61;"menu_Intro" Storyboard.TargetProperty&#61;"(UIElement.Projection).(PlaneProjection.RotationX)"

From&#61;"90" To&#61;"0" Duration&#61;"0:0:0.20" BeginTime&#61;"0:0:0.60"/>

<DoubleAnimation Storyboard.TargetName&#61;"menu_My" Storyboard.TargetProperty&#61;"(UIElement.Projection).(PlaneProjection.RotationX)"

From&#61;"90" To&#61;"0" Duration&#61;"0:0:0.20" BeginTime&#61;"0:0:0.60"/>

<DoubleAnimation Storyboard.TargetName&#61;"menu_Cloud" Storyboard.TargetProperty&#61;"(UIElement.Projection).(PlaneProjection.RotationX)"

From&#61;"90" To&#61;"0" Duration&#61;"0:0:0.20" BeginTime&#61;"0:0:0.80"/>

Storyboard>

灯笼移动&#xff1a;

<Storyboard x:Name&#61;"sb_LanternMove" Completed&#61;"sb_LanternMove_Completed">

<DoubleAnimation Storyboard.TargetName&#61;"img_Lantern" Storyboard.TargetProperty&#61;"(UIElement.RenderTransform).(CompositeTransform.ScaleX)"

From&#61;"1" To&#61;"0.9" Duration&#61;"0:0:1"/>

<DoubleAnimation Storyboard.TargetName&#61;"img_Lantern" Storyboard.TargetProperty&#61;"(UIElement.RenderTransform).(CompositeTransform.ScaleY)"

From&#61;"1" To&#61;"0.9" Duration&#61;"0:0:1"/>

<DoubleAnimation Storyboard.TargetName&#61;"img_Lantern" Storyboard.TargetProperty&#61;"(UIElement.RenderTransform).(CompositeTransform.TranslateX)"

From&#61;"0" To&#61;"150" Duration&#61;"0:0:1"/>

<DoubleAnimation Storyboard.TargetName&#61;"img_Lantern" Storyboard.TargetProperty&#61;"(UIElement.RenderTransform).(CompositeTransform.TranslateY)"

From&#61;"0" To&#61;"-10" Duration&#61;"0:0:1"/>

 

Storyboard>

关于飞入&#xff1a;

<Storyboard x:Name&#61;"sb_About">

<DoubleAnimation Storyboard.TargetName&#61;"tb_About" Storyboard.TargetProperty&#61;"(UIElement.RenderTransform).(CompositeTransform.TranslateY)"

From&#61;"50" To&#61;"0" Duration&#61;"0:0:1"/>

<DoubleAnimation Storyboard.TargetName&#61;"tb_About" Storyboard.TargetProperty&#61;"Opacity"

From&#61;"0" To&#61;"1" Duration&#61;"0:0:1"/>

Storyboard>

然后利用 storyboard的 Completed 事件来将它们连贯起来&#xff1a;

protected async override void OnNavigatedTo(NavigationEventArgs e)

{

if (e.NavigationMode &#61;&#61; NavigationMode.New)

{

Logger.LogAgent.GetInstance().WriteLog(this.GetType().FullName);

 

this.isBack &#61; false;

await Windows.UI.ViewManagement.StatusBar.GetForCurrentView().HideAsync();

this.sb_LanternRotate.Begin();

}

else

{

this.isBack &#61; true;

this.sb_Menu.Begin();

}

}

private void sb_LanternRotate_Completed(object sender, object e)

{

this.sb_Menu.Begin();

}

 

private void sb_Menu_Completed(object sender, object e)

{

if (!this.isBack)

{

this.sb_LanternMove.Begin();

}

}

private void sb_LanternMove_Completed(object sender, object e)

{

this.sb_About.Begin();

}

要注意的就是在OnNavigatedFrom中&#xff0c;需要把再次进入页面时还会移动的动画元素归位&#xff1a;

this.menu_Guess.Projection.SetValue(PlaneProjection.RotationXProperty, 90);

this.menu_Produce.Projection.SetValue(PlaneProjection.RotationXProperty, 90);

this.menu_Intro.Projection.SetValue(PlaneProjection.RotationXProperty, 90);

this.menu_My.Projection.SetValue(PlaneProjection.RotationXProperty, 90);

this.menu_Cloud.Projection.SetValue(PlaneProjection.RotationXProperty, 90);

另外就是双击完全退出APP的功能&#xff1a;

我们在页面上添加一个默认隐藏的提示&#xff1a;

<Border x:Name&#61;"bd_QuitInfo" Background&#61;"#FFC40E12" Visibility&#61;"Collapsed" Opacity&#61;"0.75" CornerRadius&#61;"10" Canvas.ZIndex&#61;"99" HorizontalAlignment&#61;"Center" VerticalAlignment&#61;"Center" BorderThickness&#61;"5" BorderBrush&#61;"Gold" Margin&#61;"0,200,50,0">

<TextBlock Style&#61;"{StaticResource RiddleGoldMessage}" HorizontalAlignment&#61;"Center" Foreground&#61;"White" Margin&#61;"20,10">

<Run Text&#61;"再按一次"/>

<LineBreak/>

<Run Text&#61;"退出应用"/>

TextBlock>

Border>

然后handle一下后退按钮按下的事件:

在OnNavigatedTo中添加&#xff1a;

Windows.Phone.UI.Input.HardwareButtons.BackPressed &#43;&#61; HardwareButtons_BackPressed;

在OnNavigatedFrom中添加&#xff1a;

Windows.Phone.UI.Input.HardwareButtons.BackPressed -&#61; HardwareButtons_BackPressed;

最后添加HardwareButtons_BackPressed事件处理方法&#xff1a;

DateTime _lastTimeClickBack &#61; DateTime.MinValue;

bool isQuitInfoOpen &#61; false;

 

void HardwareButtons_BackPressed(object sender, Windows.Phone.UI.Input.BackPressedEventArgs e)

{

var deltaTime &#61; DateTime.Now - _lastTimeClickBack;

 

// double click back button within 3 seconds

if (!isQuitInfoOpen)

{

this.menu_Guess.Projection.SetValue(PlaneProjection.RotationXProperty, 90);

this.menu_Produce.Projection.SetValue(PlaneProjection.RotationXProperty, 90);

this.menu_Intro.Projection.SetValue(PlaneProjection.RotationXProperty, 90);

this.menu_My.Projection.SetValue(PlaneProjection.RotationXProperty, 90);

this.menu_Cloud.Projection.SetValue(PlaneProjection.RotationXProperty, 90);

 

 

_lastTimeClickBack &#61; DateTime.Now;

this.bd_QuitInfo.Visibility &#61; Windows.UI.Xaml.Visibility.Visible;

isQuitInfoOpen &#61; true;

 

// close the tip within 3 seconds

ThreadPoolTimer.CreateTimer(async t &#61;>

{

await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () &#61;>

{

this.bd_QuitInfo.Visibility &#61; Windows.UI.Xaml.Visibility.Collapsed;

isQuitInfoOpen &#61; false;

this.isBack &#61; true;

this.sb_Menu.Begin();

});

}, new TimeSpan(0, 0, 3));

e.Handled &#61; true;

}

else

{

//double click back button in 5 seconds to exit

if (deltaTime.TotalSeconds <5)

{

Application.Current.Exit();

}

e.Handled &#61; true;

}

猜字谜

我们精选了323个不同长度的&#xff0c;由微软亚洲研究院自然语言计算组研发的计算机自动猜字和出字谜系统生成的字谜。每猜出一个都可以得到最多10分&#xff0c;大家可以上传自己的分数&#xff0c;总分排名在前20的小伙伴就能出现在APP内的排行榜上哦。

猜字谜的部分比较重要&#xff0c;为了赶在元宵之前能够上线&#xff0c;我们的pm兼dev Xiaowu 同志牺牲春节假期实现了这一重要功能&#xff1a;

思路大致是这样的&#xff1a;

我们自定义了2种模板控件&#xff0c;CandidateControl 作为候选字控件&#xff0c;每个都显示一个字&#xff1b; CandidateArrayControl 则作为容器处理候选字的交互。

当我们进入猜谜页面&#xff0c;为了大家不至于觉得无从猜起&#xff0c;APP会生成18个候选字的列表&#xff0c;正确答案就藏在其中。

接着将列表绑定到容器的datacontext&#xff0c;再通过容器的DataContextChanged事件&#xff0c;把候选字绑定到对应的候选字控件。

当我们点击候选字控件&#xff0c;就将对应的候选字显示谜底位置&#xff0c;并在容器中隐藏对应的候选字控件。

如果答对&#xff0c;则会播放一个小动画&#xff0c;还有音效。

如果答错3次&#xff0c;那候选字列表就会大换血&#xff0c;所以乱点也是不大容易蒙对的。

另外还可以牺牲一点分数来减少干扰项。

出字谜

出字谜则比较简单了。

我们可以写一个1~4个字的谜底&#xff0c;比如"我爱你"&#xff0c;一段提示猜什么的谜目比如"打一句话"&#xff0c;点击下一步。

APP就会把我们的谜底上传到云端的字谜系统&#xff0c;取得谜底每个字的候选谜面显示出来。

我们选好谜面&#xff08;不满意字谜系统给出的话还可以自行修改&#xff09;&#xff0c;就可以给小伙伴&#xff08;或者心上人&#xff09;去猜啦。要是觉得不错&#xff0c;可以点击收藏&#xff0c;把谜语保存到我的字谜中&#xff0c;供以后使用或者分享。

分享字谜

在可以猜字谜的页面上&#xff0c;都可以分享或者求助。具体实现可以参照我们之前的博文 博客园客户端UAP开发随笔 -- 让自己的App连接世界&#xff1a;WinRT中的微博分享博客园客户端UAP开发随笔让自己的App连接世界(2)&#xff1a;WinRT中的内置分享

另外我们还提供了分享到云端字谜的功能。

云端字谜

云端字谜都是小伙伴们分享上来的字谜&#xff0c;而且答对也能加分哦。想在排行榜上秀出来&#xff0c;就靠它了。

好吧&#xff0c;就写到这里&#xff0c;大家有意见欢迎拍过来啊。

我们的APP链接&#xff1a;微软字谜

MSRA的网页版字谜&#xff1a;微软字谜&#xff08;在线&#xff09;

最后祝大家元宵节快乐~



推荐阅读
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Iamtryingtocreateanarrayofstructinstanceslikethis:我试图创建一个这样的struct实例数组:letinstallers: ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 标题: ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • 用Vue实现的Demo商品管理效果图及实现代码
    本文介绍了一个使用Vue实现的Demo商品管理的效果图及实现代码。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
author-avatar
uai_128366833952
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有