在uwp仿IOS的页面切换效果
有时候我们需要编写一些迎合IOS用户使用习惯的uwp应用,我在这里整理一下仿IOS页面切换效果的代码。
先分析IOS的页面切换。用户使用左右滑动方式进行前进和后退,播放类似于FlipView的切换动画。导航到新页面时,使用页面前进的动画。
UWP自带很多切换效果,位于 Windows.UI.Xaml.Media.Animation 中。与苹果的切换效果最接近的是 PaneThemeTransition (而不是EdgeUIThemeTransition)。
PaneThemeTransition的效果是从它的Edge属性规定的方位平移进入,从Edge属性规定的方位平移退出。
苹果的切换方式是:
新建和前进:从右边平移进入,从左边平移退出。
返回:从左边平移进入,从右边平移退出。
分析完这些,大致的实现步骤就明了了。
在页面初始化时添加PaneThemeTransition
在进入动画播放前判断导航方式并设定Edge属性。不考虑刷新这种情况,如果是返回就是Left,否则是Right。
在退出动画播放前判断导航方式并设定Edge属性。不考虑刷新这种情况,如果是返回就是Right,否则是Left。
照这个思路写出来的代码是这样的:
VB
Imports Windows.UI.Xaml.Media.Animation
''' <summary>
''' 移植苹果的应用时使用。这种页面自带苹果导航动画和手势。
''' </summary>
Public MustInherit Class AppleAnimationPage
Inherits Page
Dim PaneAnim As New PaneThemeTransition With {.Edge = EdgeTransitionLocation.Right}
Sub New()
MyBase.New
Transitions = New TransitionCollection
Transitions.Add(PaneAnim)
End Sub
Protected Overrides Sub OnNavigatedTo(e As NavigationEventArgs)
PaneAnim.Edge = If(e.NavigationMode = NavigationMode.Back, EdgeTransitionLocation.Left, EdgeTransitionLocation.Right)
MyBase.OnNavigatedTo(e)
End Sub
Protected Overrides Sub OnNavigatingFrom(e As NavigatingCancelEventArgs)
PaneAnim.Edge = If(e.NavigationMode <> NavigationMode.Back, EdgeTransitionLocation.Left, EdgeTransitionLocation.Right)
MyBase.OnNavigatingFrom(e)
End Sub
End Class
接下来是写手势代码。首先设置一下手势的模式为横向平移,然后对ManipulationCompleted事件进行处理。这里判断的逻辑是不唯一的。我自己想了一种判断的方法,代码写上之后是这样的:
VB
Imports Windows.UI.Xaml.Media.Animation
''' <summary>
''' 移植苹果的应用时使用。这种页面自带苹果导航动画和手势。
''' </summary>
Public MustInherit Class AppleAnimationPage
Inherits Page
Dim PaneAnim As New PaneThemeTransition With {.Edge = EdgeTransitionLocation.Right}
Sub New()
MyBase.New
Transitions = New TransitionCollection
Transitions.Add(PaneAnim)
ManipulationMode = ManipulationModes.TranslateX
End Sub
Protected Overrides Sub OnNavigatedTo(e As NavigationEventArgs)
PaneAnim.Edge = If(e.NavigationMode = NavigationMode.Back, EdgeTransitionLocation.Left, EdgeTransitionLocation.Right)
MyBase.OnNavigatedTo(e)
End Sub
Protected Overrides Sub OnNavigatingFrom(e As NavigatingCancelEventArgs)
PaneAnim.Edge = If(e.NavigationMode <> NavigationMode.Back, EdgeTransitionLocation.Left, EdgeTransitionLocation.Right)
MyBase.OnNavigatingFrom(e)
End Sub
Private Sub AppleAnimationPage_ManipulationCompleted(sender As Object, e As ManipulationCompletedRoutedEventArgs) Handles Me.ManipulationCompleted
Dim trans = e.Cumulative.Translation
Dim DeltaX As Double = Math.Abs(trans.X)
If Math.Abs(trans.Y) * < DeltaX AndAlso DeltaX > ActualWidth / 2 Then
If trans.X > Then
If Frame.CanGoBack Then Frame.GoBack()
Else
If Frame.CanGoForward Then Frame.GoForward()
End If
End If
End Sub
End Class
这些代码在我的Lumia 1520和屏幕9英寸的平板进行过测试,有比较理想的切换效果。
底下评论有人需要c#代码,转换后的在这里:
C#
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using Windows.UI.Xaml.Media.Animation; // 此代码使用 SharpDevelop 4.4 转换
// 要用的话自己加上命名空间。因为c#项目要求自己写一个与项目的根命名空间符合的命名空间 /// <summary>
/// 移植苹果的应用时使用。这种页面自带苹果导航动画和手势。
/// </summary>
public abstract class AppleAnimationPage : Page
{
PaneThemeTransition PaneAnim = new PaneThemeTransition { Edge = EdgeTransitionLocation.Right };
public AppleAnimationPage() : base()
{
ManipulationCompleted += AppleAnimationPage_ManipulationCompleted;
Transitions = new TransitionCollection();
Transitions.Add(PaneAnim);
ManipulationMode = ManipulationModes.TranslateX;
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
PaneAnim.Edge = e.NavigationMode == NavigationMode.Back ? EdgeTransitionLocation.Left : EdgeTransitionLocation.Right;
base.OnNavigatedTo(e);
}
protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
PaneAnim.Edge = e.NavigationMode != NavigationMode.Back ? EdgeTransitionLocation.Left : EdgeTransitionLocation.Right;
base.OnNavigatingFrom(e);
}
private void AppleAnimationPage_ManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e)
{
var trans = e.Cumulative.Translation;
double DeltaX = Math.Abs(trans.X);
if (Math.Abs(trans.Y) * < DeltaX && DeltaX > ActualWidth / ) {
if (trans.X > ) {
if (Frame.CanGoBack)
Frame.GoBack();
} else {
if (Frame.CanGoForward)
Frame.GoForward();
}
}
}
}
在uwp仿IOS的页面切换效果的更多相关文章
- [Swift通天遁地]九、拔剑吧-(7)创建旋转和弹性的页面切换效果
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- [Swift通天遁地]九、拔剑吧-(8)创建气泡式页面切换效果
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- jquery mobile页面切换效果(Flip toggle switch)(注:jQuery移动使用的数据属性的列表。 )
1.页面切换(data-transition)
- Android - FragmentTabHost 与 Fragment 制作页面切换效果
使用 FragmentTabHost 与 Fragment 制作页面切换效果 API 19 TabHost已经不建议使用了.用 FragmentTabHost 来代替TabHost.实际上 Fragm ...
- Android - TabHost 与 Fragment 制作页面切换效果
Android - TabHost 与 Fragment 制作页面切换效果 Android API 19 , API 23 三个标签页置于顶端 效果图: 在文件BoardTabHost.java中定义 ...
- html5各种页面切换效果和模态对话框
页面动画:data-transition 属性可以定义页面切换是的动画效果.例如:<a href="index.html" data-transition="pop ...
- 基于html5和css3响应式全屏滚动页面切换效果
分享一款全屏响应式的HTML5和CSS3页面切换效果.这个页面布局效果对于那些页面要求固定100%高度和宽度的网站和APP来说是十分有用的.效果图如下: 在线预览 源码下载 HTML wrappe ...
- WP8 NavigationInTransition实现页面切换效果
NavigationInTransition这个是实现页面切换效果,而且没控件来拖,要自己手动写, 将App.xaml.cs中InitializePhoneApplication()函数里的RootF ...
- Windows Phone 8: NavigationInTransition实现页面切换效果
NavigationInTransition这个是实现页面切换效果,而且没控件来拖,要自己手动写, 将App.xaml.cs中InitializePhoneApplication()函数里的RootF ...
随机推荐
- C3P0Tool
c3p0-config.xml <c3p0-config> <named-config name="c3p0"> <property name=&qu ...
- 一梦浮生2012 IOS高级进阶目录
一梦浮生2012 精通iphone的UI开发,能熟练操作复杂表视图,熟练使用图层技术, 可以自定义UI控件,使用类别扩展系统控件功能; 擅长通讯技术,熟悉各种通信协议,精通xml, json, 二进制 ...
- Python-day-9- RabbitMQ队列
RabbitMQ队列 安装 http://www.rabbitmq.com/install-standalone-mac.html 安装python rabbitMQ module pip insta ...
- bzoj5073
dp 字符串dp不太会啊... 这种序列和子串的匹配一般设两个状态,dp[i][j]表示当前s匹配到i,t匹配到j的...,g[i][j]表示当前s匹配到i,t匹配到j,i,j必须匹配的...,noi ...
- B - Preparing Olympiad
Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Description You ha ...
- sql server编写一个语句脚本自动清空各表数据以初始化数据库
问题:有时已有项目要移植,例如原来在广州地区使用的某系统,突然说惠州那边也要用这套一样的系统.或者,在demo环境下弄了一些测试数据.然后要清空全部表数据.如果表比较多的话,逐个表手工编写脚本就太麻烦 ...
- cocos2d-html5基础
1 环境搭建 版本Cocos2d-html5-v2.2,tomcat7.0 配置tomcat,然后直接解压Cocos2d-html5-v2.2.zip,访问解压后的根目录的index.html就可以看 ...
- Linux下下载百度网盘资料
因为百度网盘没有Linux下的客户端,所以无法直接下载网盘里的资料了.各路大神各显神通,提出了各种解决方法,这里只介绍两种. 1.BaiduPCS Github上有人通过Go语言写了一个Baidu网盘 ...
- YCOJ单向公路
题目: 描述 某地区有许多城镇,但并不是每个城镇都跟其他城镇有公路连接,并且有的公路并不能双向行驶.现在我们把这些城镇间的公路分布及允许的行驶方向告诉你,你需要编程解决通过公路是否可以从一个城镇到达另 ...
- css width
转载:http://blog.csdn.net/dddddz/article/details/8631655