UWP滑动手势

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

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

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

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

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

一、手势操作流程关键点

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

    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 < 0)
     {
         _tt.X = 0;
        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 = 0;

                if (abs_delta < this.ActualWidth / 3 && speed < 0.5)
                {
                    _tt.X = 0;
                    return;
                }

                action = 0;
                if (delta > 0)
                    to = this.ActualWidth;
                else if (delta < 0)
                    return;

                var s = new Storyboard();
                var doubleanimation = new DoubleAnimation() { Duration = new Duration(TimeSpan.FromMilliseconds(120)), 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 == 0)
                MasterPage.BackRequest(sender);
            else
            {
                MasterPage.MainEntryTapped((PageID + action + 3) % 3);
            }

            _tt = this.RenderTransform as TranslateTransform;
            if (_tt == null) this.RenderTransform = _tt = new TranslateTransform();
            _tt.X = 0;
        }

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

三、一些需要注意的地方

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

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

    <ScrollViewer Grid.Row="1" ScrollViewer.HorizontalScrollBarVisibility="Hidden" ScrollViewer.VerticalScrollBarVisibility="Hidden">
            <StackPanel Orientation="Vertical" ManipulationMode="System,TranslateX" >
                <ItemsControl x:Name="control_blacklist" ItemsSource="{Binding BlackList}" Grid.Row="1">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Vertical" ManipulationMode="System,TranslateX" >
                                <mine:MineBlackListControl Background="White"></mine:MineBlackListControl>
                                <Line X1="1" 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>
时间: 2024-12-28 12:19:00

UWP滑动手势的相关文章

iOS-响应上下左右滑动手势

iOS-响应上下左右滑动手势 分类: iPhone开发2012-03-17 14:42 25489人阅读 评论(8) 收藏 举报 iosup -(void)viewDidLoad{ UISwipeGestureRecognizer *recognizer; recognizer = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleSwipeFrom:)]; [recognizer setDir

Android 滑动手势简单使用方法

用法:首先让指定的Activity实现Android.view.OnGestureListener,然后在你需要调用GestureDetector的View上,添加onTouchListener,之后setLongClickable(true)即可. 如: customView.setOnTouchListner(xxxListener); customView.setLongClickable(true); 之后就可以在onFling方法中设置你想要的手势. onFling方法参数解释: on

解决ViewPage中嵌套有ListView或者滑动手势等造成滑动的冲突

public class ViewPagerCompat extends ViewPager { //mViewTouchMode表示ViewPager是否全权控制滑动事件,默认为false,即不控制 private boolean mViewTouchMode = false; public ViewPagerCompat(Context context, AttributeSet attrs) { super(context, attrs); } public void setViewTou

UIView上的滑动手势及动作

///////////注flowView为UIView////////// //添加滑动手势事件 UIPanGestureRecognizer *gestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:flowView action:@selector(handleGesture:)]; [flowView addGestureRecognizer:gestureRecognizer]; //添加点击手势事件 flow

如何添加ZBLibrary中的底部左右滑动手势

我们可以查看一下以前版本的ASP.NET程序,它是没有Main()函数的,也就是说它没有程序入口点,不是单独的进程.对于应用程序开发来说,这个问题并不大,因为开发者在意的Web程序的逻辑.数据安全等问题,而不是应用程序如何被加载.但对于一个Web框架来说,这个问题非常严重,因为它高度依赖IIS和Windows Server,减少了它的适用范围.如果我们查看ASP.NET Core的程序,你会发现它本质上就是一个控制台程序,如果我们把那些在Main()函数中自动生成的代码都删掉(VS2015的模板

【转】让Bootstrap轮播插件carousel支持左右滑动手势的三种方法

因为最近开发的项目涉及到移动设备上的 HTML5 开发,其中需要实现轮播效果.然后最快捷的方式,你知道的(Bootstrap),然后原生的 Bootstrap 的 carousel.js 插件并没有支持手势. 然后......自己想办法呗,再然后,就有下面3种解决方案 : jQuery Mobile (http://jquerymobile.com/download/) $("#carousel-generic").swipeleft(function() { $(this).caro

让Bootstrap轮播插件carousel支持左右滑动手势的三种方法

因为最近开发的项目涉及到移动设备上的 HTML5 开发,其中需要实现轮播效果.然后最快捷的方式,你知道的(Bootstrap),然后原生的 Bootstrap 的 carousel.js 插件并没有支持手势. 然后......自己想办法呗,再然后,就有下面3种解决方案 : jQuery Mobile (http://jquerymobile.com/download/) $("#carousel-generic").swipeleft(function() { $(this).caro

Android开发之手势滑动(滑动手势监听)

在Android应用中,经常需要手势滑动操作,比如上下滑动,或左右方向滑动,处理手势滑动通常有两种方法:一种是单独实现setOnTouchListener监听器来,另一种是构建手势探测器 第一种方法,就是在要实现滑动的View中,实现OnTouchListener监听事件,然后判断KeyDonw和KeyUp 直接的位置距离来判断滑动方向,核心实现代码如下: /** * 设置上下滑动作监听器 * @author caizhiming */ private void setGestureListen

关于移动端滑动手势

背景: 基于要尝试的移动端项目需要有一个通过上拉下滑手势达成加载不同数据的功能,其涉及到滑动手势和ajax数据加载方面的知识点.故对整个实现过程做一个记录整理.个人JS功底有限,看了诸多例子和对于移动端手势知识点梳理的技术博客才对做到了对功能的实现.并且也在这个过程中,才初步了解到了移动端框架Zepto.js._(:з」∠)_ 当然,最后还是选择了尽量用原生来实现这一个功能,只因为这样才能够对整个功能实现原理理解上更充分些,想尽量少依赖于插件.不过到了数据加载上,因为时间成本等原因最后还是用上了