经过近些年智能手机App的不断发展,用户已经不仅仅满足于功能上的需求。UI、设计等非功能点逐渐在App体验中占了大多数的分数。不知从何时起,滑动手势就成为了App的一个标配。他不仅仅是一个功能,更是一个UI设计。其有以下几个优点:

  1.方便了单手操作。在当今大屏手机占有率越来越高的趋势下,简洁方便的单手操作模式是很有必要的。

  2.美化了UI。你可能会有疑问,这是个功能,为什么美化了UI呢?其实,手势操作的另一个利器就是隐藏了部分不是那么美观的UI,使得界面看上去更简。比如邮件App ,你如果要在界面上加入删除、标记、已读未读等Button,那么界面会相当拥挤。

  3.让用户觉得你的App技术含量不是那么低。大多数用户不懂技术,他们只看功能。如果别人有的东西你没有,他们就会认为你的App技术含量过低。

综上所述,在你的App中加上滑动手势非常有必要。

本文GitHub地址

一、手势操作流程关键点

  手势操作有三个关键状态:操作开始时、操作进行时、操作结束时。

    1.操作开始时

在用户开始手势操作的那一刻,这时候主要进行一些初始化操作。

    2.操作进行时

这时候不断的计算用户手势相关的各种数据,方便后续处理。

    3.操作结束时

这时候就是自由发挥了,你可以处理一些事件、功能。比如:页面后退、显示删除按钮等等 。

有一点需要注意:用户可能并不是完全的水平或者竖直滑动,所以最好加上速度和位移长度双重判断处理。

二、实战演示

在旺信UWP项目中,我们使用了滑动手势来进行页面的后退。下面我就以这个例子进行剖析。因为每个页面都需要用到手势,所以最好建一个BasePage类,然后让所有页面继承这个类。

    1.相关事件添加

  在BasePage的构造函数中添加相关事件和手势监听的模式

private TranslateTransform _tt; 

this.ManipulationMode = ManipulationModes.TranslateX; 

this.ManipulationCompleted += BasePage_ManipulationCompleted; 

this.ManipulationDelta += BasePage_ManipulationDelta; 

_tt = this.RenderTransform as TranslateTransform; 

if (_tt == null)
this.RenderTransform = _tt = new TranslateTransform();

    2.手势操作时的处理

private void BasePage_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
if (_tt.X + e.Delta.Translation.X < )
{
_tt.X = ;
return;
}
_tt.X += e.Delta.Translation.X;
}

    3.手势结束时的操作

        private void BasePage_ManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e)
{
double abs_delta = Math.Abs(e.Cumulative.Translation.X);
double speed = Math.Abs(e.Velocities.Linear.X);
double delta = e.Cumulative.Translation.X;
double to = ; if (abs_delta < this.ActualWidth / && speed < 0.5)
{
_tt.X = ;
return;
} action = ;
if (delta > )
to = this.ActualWidth;
else if (delta < )
return; var s = new Storyboard();
var doubleanimation = new DoubleAnimation() { Duration = new Duration(TimeSpan.FromMilliseconds()), From = _tt.X, To = to };
doubleanimation.Completed += Doubleanimation_Completed;
Storyboard.SetTarget(doubleanimation, _tt);
Storyboard.SetTargetProperty(doubleanimation, "X");
s.Children.Add(doubleanimation);
s.Begin(); }

    4.结束后的动画效果

     private void Doubleanimation_Completed(object sender, object e)
{
if (action == )
//这里进行动画结束后的操作,比如:页面后退 _tt = this.RenderTransform as TranslateTransform;
if (_tt == null) this.RenderTransform = _tt = new TranslateTransform();
_tt.X = ;
}

    这里为了视觉上的美观,在手势结束后增加了一段动画效果。使页面间的跳转显得不那么生硬。

三、一些需要注意的地方

有些控件自身带有手势功能,如:listview、scrollview等。这时候上边自己添加的手势事件就会被自动屏蔽掉。下边是我个人的解决方案,如果你有更好的方法,欢迎一起讨论。

方案一:在DataTemplate上下手,加一个StackPanel,然后给他来个ManipulationMode="System,TranslateX"

    <ScrollViewer Grid.Row="" ScrollViewer.HorizontalScrollBarVisibility="Hidden" ScrollViewer.VerticalScrollBarVisibility="Hidden">
<StackPanel Orientation="Vertical" ManipulationMode="System,TranslateX" >
<ItemsControl x:Name="control_blacklist" ItemsSource="{Binding BlackList}" Grid.Row="">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical" ManipulationMode="System,TranslateX" >
<mine:MineBlackListControl Background="White"></mine:MineBlackListControl>
<Line X1="" Style="{StaticResource WXLineStyle}" VerticalAlignment="Bottom" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</ScrollViewer>

  方案二:这种方式和上边那种一样,只不过是统一处理了

    <Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical" Background="Transparent" ManipulationMode="System,TranslateX"/>
</ItemsPanelTemplate>
</Setter.Value>
</Setter>

UWP滑动后退的更多相关文章

  1. Swipe to back not working滑动后退功能消失?

    如果你发现滑动后退功能突然失效了,很可能是因为你隐藏了NavigationBar 或者定制了 leftBarButtonItem(s) 这会导致 NavigationController 的 inte ...

  2. ionic在ios侧滑页面空白 禁用视图滑动后退

    本人在ios10左右滑动的时候,经常出现左滑页面后退,然后整个页面空白现象,只能强行退出,并重新登录,最简单的方法就是禁用侧滑后退这个功能: 在app.js上config增加如下: $ionicCon ...

  3. win10 UWP 标题栏后退

    设置里,标题栏有后退按钮 在win平板,可以有后退键,手机也有 pc可以在标题栏 在OnLaunched //最后 Windows.UI.Core.SystemNavigationManager.Ge ...

  4. win10 uwp 入门

    UWP是什么我在这里就不说,本文主要是介绍如何入门UWP,也是合并我写的博客. 关于UWP介绍可以参见:http://lib.csdn.net/article/csharp/32451 首先需要申请一 ...

  5. 2018-9-14-win10-UWP-标题栏后退

    title author date CreateTime categories win10 UWP 标题栏后退 lindexi 2018-9-14 20:22:8 +0800 2018-2-13 17 ...

  6. iOS 完美解决 interactivePopGestureRecognizer 卡住的问题

    interactivePopGestureRecognizer是iOS7推出的解决VeiwController滑动后退的新功能,虽然很实用,但是坑也很多啊,用过的同学肯定知道问题在哪里,所以具体问题我 ...

  7. ios侧滑返回:完美解决 interactivePopGestureRecognizer 卡住的问题

    interactivePopGestureRecognizer是iOS7推出的解决VeiwController滑动后退的新功能,虽然很实用,但是坑也很多啊(比如在rootViewcontroller下 ...

  8. 2018-2-13-win10-uwp-入门

    title author date CreateTime categories win10 uwp 入门 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:23 ...

  9. C# 设计模式 责任链

    责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个 ...

随机推荐

  1. TCP/IP详解系列 --- 概念总结02

    TCP复位报文段(RST)的用途: 1.当客户端程序访问不存在的端口时,目标主机将给它发送一个复位报文段:收到复位报文段的一端应该关闭连接或者重新连接,而不能回应这个复位报文段. 2.当客户端程序向服 ...

  2. DLL强名称引用问题

    为没有源码的DLL文件添加强名称 如果项目中引用了其他没有源码的dll文件,并且此dll文件是没有强名称的程序集,则编译时会出现类似 "Assembly generation failed ...

  3. VBA用户控件

    窗体相关 1.显示窗体 UserForm1.show  [vbModeless] vbModeless 可选参数,参数设定后,变成无模式窗体.窗体保持显示状态,仍可操作Excel文件. UserFor ...

  4. DEV设计之自动流水号,DEV专家解答,自己折腾了半天也没有搞定,怪英文不好

    () 老外专家给了回答,结果没有全到懂,又折腾了20分钟朋友提示才搞定 获取一个自动增加1的流水号值, 第一个参数是本事的数据库连接对象,第2个参数是也这个值为唯一标识返回来一个增量的值,第三个好像没 ...

  5. Scala学习笔记一

    首先是安装Scala 下载Scala进行安装 http://www.scala-lang.org/ 安装好scala后,为scala配置系统环境参数 新建环境变量SCALA_HOME,值为scala安 ...

  6. SQL Server Bulk Insert批量数据导入

    SQL Server的Bulk Insert语句可以将本地或远程的数据文件批量导入到数据库中,速度非常的快.远程文件必须共享才行,文件路径须使用通用约定(UNC)名称,即"\\服务器名或IP ...

  7. [09]APUE:进程关系

    [a] getpgid / setpgid #include <unistd.h> pid_t getpgid(pid_t pid) //成功返回进程组 ID,出错返回 -1 int se ...

  8. mac地址和ip地址、子网掩码和默认网关

    MAC地址 MAC(Media Access Control或者Medium Access Control)地址,意译为媒体访问控制,或称为物理地址.硬件地址,用来定义网络设备的位置.在OSI模型中, ...

  9. 模拟XShell的小项目

    不知道大家有没有用过XShell这款工具,这款工具通过windows可以远程操作处于开机状态的linux操作系统,也就是说把你的电脑和一台服务器连入网络,你通过输入服务器所在的IP地址建立一个会话就可 ...

  10. GCC4.8.2升级安装

    一.查看本机GCC版本: 使用gcc -v 查看本机版本信息,我的gcc版本为: gcc 版本 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC) 二.升级或安装编译器: 1 ...