UWP滑动后退

  经过近些年智能手机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 < 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)//这里进行动画结束后的操作,比如:页面后退_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>

 

转载于:https://www.cnblogs.com/ms-uap/p/5275157.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyQt5 高级界面控制(表格、树、tab、dock、scrollbar、多文档界面)

文章目录1. 表格与树1.1 QTableView1.2 QListView1.3 QListWidget1.4 QTableWidget表根据界面宽度自动伸缩禁止编辑单击某单元&#xff0c;使之默认选中整行设置宽高度与内容相匹配是否显示表头单元格中放置控件输入行号&#xff0c;快速定位行设置颜色加粗字体排序文本对齐合并…

使用pymysql进行数据库的增删改查

使用pymysql进行数据库的增删改查&#xff1a; import pymysqldatabase pymysql.connect(127.0.0.1,root,root,jxgl,charsetutf8)# 初始化指针 cursor database.cursor()# 增 # sql "insert into students(s_no,s_name,sex,birthday,D_NO,address,phone) VALUES (1230…

PyQt5 高级界面控制(多线程、网页交互、调用JavaScript)

文章目录1. 多线程1.1 QTimer1.2 QThread界面卡住例子分离UI和工作线程1.3 事件处理2. 网页交互显示本地 html显示 html 代码调用 JavaScriptJavaScript 调用 PyQt代码learn from 《PyQt5 快速开发与实战》 https://doc.qt.io/qtforpython/index.html https://www.riverbankcom…

读写Excel 用 xlsxwriter,openpyxl 更灵活

一、xlsxwriter的使用&#xff1a; # import xlwt # # workbook xlwt.Workbook() # sheet0 workbook.add_sheet(sheet0) # for i in range(0,300): # sheet0.write(0,i,i) # workbook.save(number.xls)# 以上代码运行会报错&#xff0c;因为xlwt不支持超过256列的表格im…

LeetCode 2293. 极大极小游戏

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的整数数组 nums &#xff0c;其长度是 2 的幂。 对 nums 执行下述算法&#xff1a; 设 n 等于 nums 的长度&#xff0c;如果 n 1 &#xff0c;终止 算法过程。否则&#xff0c;创建 一个新的整数数组 newNums &#x…

LeetCode 2294. 划分数组使最大差为 K

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums 和一个整数 k 。你可以将 nums 划分成一个或多个 子序列 &#xff0c;使 nums 中的每个元素都 恰好 出现在一个子序列中。 在满足每个子序列中最大值和最小值之间的差值最多为 k 的前提下&#xff0c;返回需要划分的 最…

LeetCode 2295. 替换数组中的元素

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的数组 nums &#xff0c;它包含 n 个 互不相同 的正整数。请你对这个数组执行 m 个操作&#xff0c;在第 i 个操作中&#xff0c;你需要将数字 operations[i][0] 替换成 operations[i][1] 。 题目保证在第 i 个操作中&a…

LeetCode 2296. 设计一个文本编辑器(双栈)

文章目录1. 题目2. 解题1. 题目 请你设计一个带光标的文本编辑器&#xff0c;它可以实现以下功能&#xff1a; 添加&#xff1a;在光标所在处添加文本。删除&#xff1a;在光标所在处删除文本&#xff08;模拟键盘的删除键&#xff09;。移动&#xff1a;将光标往左或者往右移…

五、scrapy爬虫框架——logging 模块的使用

logging 模块的使用 1、scrapy settings中设置LOG_LEVEL“WARNING”settings中设置LOG_FILE"./a.log"#设置日志保存的位置&#xff0c;设置会后终端不会显示日志内容import logging,实例化logger的方式在任何文件中使用logger输出内容 2、普通项目中 import logg…

PyQt5 布局管理(水平、垂直、网格、表单、嵌套、QSplitter)

文章目录1. 布局管理2. 使用绝对位置布局3. QBoxLayoutaddStretch() 添加可伸缩控件4. QGridLayout5. QFormLayout6. 嵌套布局7. QSplitter 布局learn from 《PyQt5 快速开发与实战》 https://doc.qt.io/qtforpython/index.html https://www.riverbankcomputing.com/static/Doc…

一、Java 面向对象高级——Object类、常用API

day01【Object类、常用API】 主要内容 Object类Date类DateFormat类Calendar类System类StringBuilder类包装类 教学目标 -[ ] 能够说出Object类的特点 -[ ] 能够重写Object类的toString方法 -[ ] 能够重写Object类的equals方法 -[ ] 能够使用日期类输出当前日期 -[ ] 能够使…

FineUI(专业版)v3.0.0 发布,手机、平板和桌面全支持!

FineUI&#xff08;专业版&#xff09;v3.0.0 已经正式发布&#xff0c;全面支持手机、平板和桌面&#xff01;自 2008 年 4 月发布第一个版本&#xff0c;我们持续更新了 126 个版本&#xff0c;拥有 16000 多位注册用户&#xff0c;1300 多位捐赠会员&#xff0c;200 多位网友…

二、Java 面向对象高级——Collection、泛型

day02【Collection、泛型】 主要内容 Collection集合迭代器增强for泛型 教学目标 能够说出集合与数组的区别 说出Collection集合的常用功能 能够使用迭代器对集合进行取元素 能够说出集合的使用细节 能够使用集合存储自定义类型 能够使用foreach循环遍历集合 能够使用泛型定…

LeetCode 2299. 强密码检验器 II

文章目录1. 题目2. 解题1. 题目 如果一个密码满足以下所有条件&#xff0c;我们称它是一个 强 密码&#xff1a; 它有至少 8 个字符。至少包含 一个小写英文 字母。至少包含 一个大写英文 字母。至少包含 一个数字 。至少包含 一个特殊字符 。特殊字符为&#xff1a;"!#…

LeetCode 2300. 咒语和药水的成功对数(二分查找)

文章目录1. 题目2. 解题1. 题目 给你两个正整数数组 spells 和 potions &#xff0c;长度分别为 n 和 m &#xff0c;其中 spells[i] 表示第 i 个咒语的能量强度&#xff0c;potions[j] 表示第 j 瓶药水的能量强度。 同时给你一个整数 success 。一个咒语和药水的能量强度 相…

三、Java 面向对象高级——数据结构、List、Set、Collection

day03 【List、Set、数据结构、Collections】 主要内容 数据结构List集合Set集合Collections 教学目标 能够说出List集合特点 能够说出常见的数据结构 能够说出数组结构特点 能够说出栈结构特点 能够说出队列结构特点 能够说出单向链表结构特点 能够说出Set集合的特点 能够说…

Centos Cacti 0.8.8g

Centos Cacti 0.8.8g 一、Cacti简介1. cacti是用php语言实现的一个软件&#xff0c;它的主要功能是用snmp服务获取数据&#xff0c;然后用rrdtool储存和更新数据&#xff0c;当用户需要查看数据的时候用rrdtool生成图表呈现给用户。因此snmp和rrdtool是cacti的关键。Snmp关系着…

LeetCode 2301. 替换字符后匹配(字典)

文章目录1. 题目2. 解题1. 题目 给你两个字符串 s 和 sub 。同时给你一个二维字符数组 mappings &#xff0c;其中 mappings[i] [oldi, newi] 表示你可以替换 sub 中任意数目的 oldi 字符&#xff0c;替换成 newi 。sub 中每个字符 不能 被替换超过一次。 如果使用 mappings…

一、Web服务器——Tomcat Servlet学习笔记

今日内容 web相关概念回顾web服务器软件&#xff1a;TomcatServlet入门学习 一、web相关概念回顾 软件架构 C/S&#xff1a;客户端/服务器端B/S&#xff1a;浏览器/服务器端 资源分类 静态资源&#xff1a;所有用户访问后&#xff0c;得到的结果都是一样的&#xff0c;称为静态…

LeetCode 2302. 统计得分小于 K 的子数组数目(前缀和+二分查找)

文章目录1. 题目2. 解题1. 题目 一个数组的 分数 定义为数组之和 乘以 数组的长度。 比方说&#xff0c;[1, 2, 3, 4, 5] 的分数为 (1 2 3 4 5) * 5 75 。 给你一个正整数数组 nums 和一个整数 k &#xff0c;请你返回 nums 中分数 严格小于 k 的 非空整数子数组数目。 …