2019-3-27-win10-uwp-动画移动滑动条的滑块
title | author | date | CreateTime | categories |
---|---|---|---|---|
win10 uwp 动画移动滑动条的滑块
|
lindexi
|
2019-03-27 10:51:32 +0800
|
2019-03-27 10:28:18 +0800
|
Win10 UWP
|
堆栈网小伙伴问如何点击滑动条的时候,可以通过动画将滑块从原来的坐标移动到用户点击的坐标,同时用户拖动的时候不做动画
在后台代码添加两个事件,一个是按下,一个抬起,通过按下和抬起判断坐标可以知道用户是点击还是拖动。然后用上一个值和当前的值做动画就可以。
先创建一个项目,添加简单的界面
- <Slider x:Name="Slider" />
在写的时候发现有三个坑
- 路由事件的 PointerPressed 会在 Slider 吃了,需要在后台代码添加事件
- 在 PointerPressed 方法调用之前已经设置了 Slider 的值
- 动画修改了依赖属性需要修改 EnableDependentAnimation 属性
因为使用的代码很多,我将代码放在了 github 可以下载
拿到事件
在 MainPage 的构造函数添加下面代码,在后台写代码可以在控件吃了路由事件还可以拿到事件
- public MainPage()
- {
- InitializeComponent();
- Slider.AddHandler(PointerPressedEvent, new PointerEventHandler(Slider_OnPointerPressed), true);
- Slider.AddHandler(PointerReleasedEvent, new PointerEventHandler(Slider_OnPointerReleased), true);
- }
注意在后台代码的方法最后一个参数设置为 true 就表示控件吃了路由事件,也会调用方法
判断是否点击
如果用户是点击那么才使用动画,在 UWP 没有 PointerClick 事件所以需要自己写
- private void Slider_OnPointerPressed(object sender, PointerRoutedEventArgs e)
- {
- var slider = (Slider) sender;
- ClickPoint = e.GetCurrentPoint(slider).Position;
- }
- private Point ClickPoint { set; get; }
- private void Slider_OnPointerReleased(object sender, PointerRoutedEventArgs e)
- {
- var slider = (Slider) sender;
- var point = e.GetCurrentPoint(slider).Position;
- var x = point.X - ClickPoint.X;
- var y = point.Y - ClickPoint.Y;
- var length = x * x + y * y;
- if (length < 10)
- {
- // 开始动画
- }
- }
在 Slider_OnPointerPressed
拿到用户点击坐标,然后在 Slider_OnPointerReleased
判断两个点就可以知道用户是不是拖动
在 UWP 的 Windows.Foundation.Point 没有默认的两个点相减拿到向量的方法,所以我就自己写了一个
记录之前的值
在 Slider_OnPointerPressed
这些方法拿到的 Slider 的值已经更新了,因为事件是先在 Slider 然后是在 MainPage 里面的方法,在 Slider 里面修改了值,所以需要添加依赖属性用来记录之前的值
- public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
- "Value", typeof(double), typeof(MainPage), new PropertyMetadata(default(double), (s
- , e) =>
- {
- ((MainPage) s)._lastValue = (double) e.OldValue;
- }));
- public double Value
- {
- get => (double) GetValue(ValueProperty);
- set => SetValue(ValueProperty, value);
- }
- private double _lastValue;
动画
现在知道了用户是不是点击,可以开始做动画
在后台写代码比较不推荐,所以下面我就会在后台写动画。 这个逻辑好像说反了
做动画需要三步
- 定义 Storyboard 和 Animation 类
- 通过附加属性绑定 Animation 和元素
- 播放动画
于是开始第一步
- var storyboard = new Storyboard();
- var animation = new DoubleAnimation
- {
- From = _lastValue,
- To = Value,
- Duration = TimeSpan.FromSeconds(2),
- EasingFunction = new CubicEase(),
- EnableDependentAnimation = true
- };
注意,需要添加 EnableDependentAnimation = true
动画才能播放,这个和 WPF 不相同。为什么需要这个属性,在DoubleAnimation.EnableDependentAnimation文档里面说到,如果动画修改的是依赖属性,动画需要不断在主线程修改,会降低性能,所以需要用户设置这个属性
第二步开始绑定动画
- Storyboard.SetTarget(animation, Slider);
- Storyboard.SetTargetProperty(animation, "Value");
第三步开始播放动画
- storyboard.BeginTime = TimeSpan.Zero;
- storyboard.Children.Add(animation);
- storyboard.Begin();
尝试运行代码,点击一下就可以看到动画
所有代码在github
2019-3-27-win10-uwp-动画移动滑动条的滑块的更多相关文章
- win10 UWP 动画
原文:win10 UWP 动画 本文告诉大家如何写同一个简单的动画. 动画入门 本文开始写一个简单的动画,只是移动矩形作为本文的例子. 在 UWP 移动元素的动画,可以使用 RenderTransfo ...
- Win10 UI入门 导航滑动条 求UWP工作
借鉴了 段博琼 大哥写的导航滑动,自己实现了一个类似安卓 IOS 导航滑动条 支持等比例 分割 tabView 支持动画滑动 效果如下图 WYGrid 你可以想象一个GridView itemsWr ...
- 使用原生JS+CSS或HTML5实现简单的进度条和滑动条效果(精问)
使用原生JS+CSS或HTML5实现简单的进度条和滑动条效果(精问) 一.总结 一句话总结:进度条动画效果用animation,自动效果用setIntelval 二.使用原生JS+CSS或HTML5实 ...
- IOS开发-UI学习-UISlider(滑动条)的使用
滑动条即UISlider,是我们常见的软件中设置音量,亮度等的滑条,初始化及基本设置如下: // 新建滑动条 UISlider *slider = [[UISlider alloc]initWithF ...
- Win10 UWP开发系列:实现Master/Detail布局
在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档: ...
- win10 uwp 拖动控件
我们会使用控件拖动,可以让我们做出好看的动画,那么我们如何移动控件,我将会告诉大家多个方法.其中第一个是最差的,最后的才是我希望大神你去用. Margin 移动 我们可以使用Margin移动,但这是w ...
- win10 uwp 渲染原理 DirectComposition 渲染
本文来告诉大家一个新的技术DirectComposition,在 win7 之后(实际上是 vista),微软正在考虑一个新的渲染机制 在 Windows Vista 就引入了一个服务,桌面窗口管理器 ...
- win10 uwp 如何开始写 uwp 程序
本文告诉大家如何创建一个 UWP 程序. 这是一系列的 uwp 入门博客,所以写的很简单 本文来告诉大家如何创建一个简单的程序 安装 VisualStudio 在开始写 UWP 需要安装 Visual ...
- win10 uwp 萤火虫效果
原文:win10 uwp 萤火虫效果 本文在Nukepayload2指导下,使用他的思想用C#写出来. 本文告诉大家,如何使用 win2d 做出萤火虫效果. 安装 win2d 安装win2d的方法请使 ...
随机推荐
- express-generator简单使用
1.安装 npm install express npm install -g express-generator 全局安装.express-generator是一个node的自动化创建项目工具,类似 ...
- linux下用eclipse开发mapreduce遇到的问题
Unable to create the selected preference page.org/apache/hadoop/eclipse/preferences/MapReducePrefere ...
- mybatis学习:mybatis的环境搭建与入门
一.mybatis的概述: mybatis是一个持久层框架,用java编写 它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接登繁杂过程 它使用了ORM思想 ...
- RMQ—ST表
RMQ(Range Minimum/Maximum Query),RMQ是一个求给定范围内最大最小值的问题.我们一般使用st算法来解决这类问题(Sparse Table).这个算法原理不难,主要是各种 ...
- SSM10-Redis持久化和集群的搭建
1.1. Redis集群的搭建 Redis集群中至少应该有三个节点.要保证集群的高可用,需要每个节点有一个备份机. Redis集群至少需要6台服务器. 搭建伪分布式.可以使用一台虚拟机运行6个redi ...
- JS 过滤HTML标签,取得纯文本
一.过滤掉所有HTML标签如下: str.innerHTML.replace(/<.*?>/g,"") 二.过滤掉带属性的某一个标签,如<span class=' ...
- vmware的Linux虚拟机ping不通外网的解决办法
转载自:https://blog.csdn.net/l_l_b_/article/details/79409843 1.点击此处编辑 2.选择虚拟网络编辑器 3.点击更改设置 4.选择v8 并将使用本 ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---装饰模式之StarBuzzCoffee[转]
1 2{<HeadFirst设计模式>之装饰模式 } 3{ 本单元中的类为被装饰者 } 4{ 编译工具: Delphi7.0 } 5{ E-Ma ...
- logo 编程
玩了一把logo语言,好学易懂,小朋友有兴趣是个挺不错的玩意.当然也可用于一些机器人等控制 apt install ucblogo ;一个多边形 l 边长 n 边数 to sj :l :n repea ...
- Breakpoint 断点只生效一次