原文: WPF触控程序开发(三)——类似IPhone相册的反弹效果

用过IPhone的都知道,IPhone相册里,当图片放大到一定程度后,手指一放,会自动缩回,移动图片超出边框后手指一放,图片也会自动缩回,整个过程非常和谐、自然、精确,那么WPF能否做到呢,答案是肯定的。

     在没有现成的控件的情况下,只有自己做,你肯定想到做动画,WPF触屏开发提供了相应的功能来获取触控点的一些变化,这些变化的最佳消费者个人认为是Matrix。我们回想下做动画一般怎么做,比如给一个button做个宽度增5的动画,我们一般是定义一个DoubleAnimation,然后定义一个Sotryboard,然后用Sotryboard的静态方法SetTargetProperty设置UI对象和动画作用的依赖属性。按照这样的步骤,我们给UI的Matrix做动画,发现,找不到这样的一个类似DoubleAnimation的动画类,Matrix也没有类似Button.WidthProperty这样的依赖属性。也许你会说Matrix的属性OffsetX,M11什么的都是double类型,可以对其设置动画,但是Storyboard应用的对象必须是继承自DependencyProperty的,所以是不可能在Matrix的属性上设置动画的,唯一的解决方案是自己做一个类似于MatrixAnimation的东西。网上有人写过这样的动画类,如下:
    public class LinearMatrixAnimation : AnimationTimeline{public Matrix? From{set { SetValue(FromProperty, value); }get { return (Matrix)GetValue(FromProperty); }}public static DependencyProperty FromProperty = DependencyProperty.Register("From", typeof(Matrix?), typeof(LinearMatrixAnimation), new PropertyMetadata(null));public Matrix? To{set { SetValue(ToProperty, value); }get { return (Matrix)GetValue(ToProperty); }}public static DependencyProperty ToProperty = DependencyProperty.Register("To", typeof(Matrix?), typeof(LinearMatrixAnimation), new PropertyMetadata(null));public LinearMatrixAnimation(){}public LinearMatrixAnimation(Matrix from, Matrix to, Duration duration){Duration = duration;From = from;To = to;}public override object GetCurrentValue(object defaultOriginValue, object defaultDestinationValue, AnimationClock animationClock){if (animationClock.CurrentProgress == null){return null;}double progress = animationClock.CurrentProgress.Value;Matrix from = From ?? (Matrix)defaultOriginValue;if (To.HasValue){Matrix to = To.Value;Matrix newMatrix = new Matrix(((to.M11 - from.M11) * progress) + from.M11, 0, 0, ((to.M22 - from.M22) * progress) + from.M22,((to.OffsetX - from.OffsetX) * progress) + from.OffsetX, ((to.OffsetY - from.OffsetY) * progress) + from.OffsetY);return newMatrix;}return Matrix.Identity;}protected override System.Windows.Freezable CreateInstanceCore(){return new LinearMatrixAnimation();}public override System.Type TargetPropertyType{get { return typeof(Matrix); }}}

  有了这个类,我们就可以使用了:

var animation = new LinearMatrixAnimation(oldMatrix, newMatrix, TimeSpan.FromSeconds(0.5));
animation.AccelerationRatio = 0.3;
animation.DecelerationRatio = 0.3;

  有了动画,只需要用UI的MatrixTransform启动动画即可,假设某个UI的MatrixTransform为matrixTransform,我们就可以启动了:

matrixTransform.BeginAnimation(MatrixTransform.MatrixProperty, animation);

  有效果,但是貌似只能执行一次,执行完之后,后来无论怎样弄都没反应了,这是由于动画执行完后锁定了属性,网上也有人解决了,办法是在执行完动画之后做了点处理:

public static void PlayMatrixTransformAnimation(MatrixTransform matrixTransform, Matrix newMatrix, TimeSpan timeSpan)
{var animation = new LinearMatrixAnimation(matrixTransform.Matrix, newMatrix, TimeSpan.FromSeconds(0.5));animation.AccelerationRatio = 0.3;animation.DecelerationRatio = 0.3;animation.FillBehavior = FillBehavior.HoldEnd;animation.Completed += (sender, e) =>{//去除属性的动画绑定  matrixTransform.BeginAnimation(MatrixTransform.MatrixProperty, null);//将期望结果值保留  matrixTransform.Matrix = newMatrix;};//启动动画  matrixTransform.BeginAnimation(MatrixTransform.MatrixProperty, animation, HandoffBehavior.SnapshotAndReplace);
}

  这样一来,仿IPhone的反弹效果就已经差不多了。其实这里是利用了UI的MatrixTransform做了动画,有人说不是有个MatrixAnimationUsingKeyFrames动画类吗,有兴趣的人可以继续探索下。

  鉴于大家的热情,我会把全部代码整理出来放到群文件共享里,敬请关注。

WPF触控程序开发(三)——类似IPhone相册的反弹效果相关推荐

  1. Windows Phone 7三触控程序开发

    Silverlight支持了两种不同应用程序接口用于多点触控,所以很容易区分低级和高级,低级应用都是基于Touch.FrameReported事件,非常类似于XNA的TouchPanel,但是它是事件 ...

  2. Android开发实例之多点触控程序

    智能终端设备的多点触控操作为我们带来了种种炫酷体验,这也使得很多Android开发者都对多点触控程序的开发感兴趣.实际上多点触控程序的实现并不是那么遥不可及,而是比较容易.本文就主要通过一个实例具体讲 ...

  3. iOS9 3D Touch 标签菜单 peek and pop force 压力触控 功能开发高级版教程

    iOS9 3D Touch 标签菜单 peek and pop  force 压力触控 功能开发高级版教程 github地址: https://github.com/wyk125/3DTouchDem ...

  4. 软件工程习题,耦合性的概念如何与软件可移植性相关联?举例支持你的论述,应用逐步求精法为下列程序开发三种不同级别的过程抽象

    软件工程习题 11.9.耦合性的概念如何与软件可移植性相关联?举例支持你的论述 11.10.应用逐步求精法为下列程序开发三种不同级别的过程抽象,开发一个支票打印程序,给出输出金额,并按支票常规要求给出 ...

  5. 开启适用于 Force Touch 触控板的“三指拖移”

    "三指拖移"是 OS X 中的一种 Multi-Touch 手势.通过这个手势,您能使用三个手指移动屏幕上的活跃窗口. 本文介绍了在您的 Mac 配备了 Force Touch 触 ...

  6. 合泰单片机demo_合泰 单片机 BS83B08A-3 Flash 触控 单片机开发 合泰单片机

    bs83b08-3/b12-3/b16-3/b16g-3/c24-3 -- 8-bit touch key flash mcu 概述 该系列单片机是一款 8 位具有高性能精简指令集且完全集成触控按键功 ...

  7. 入门微信小程序开发(三)数据绑定的几种用法

    一.数据绑定 与书写HTML页面一样,小程序页面也只能通过多写多练提升.在构建完页面后就出现了一个问题,我们该如何获取组件元素让数据与之关联呢? 在网页开发中,我们同样使用JS操作DOM,包括数据渲染 ...

  8. java swing开发窗体程序开发(三)事件(Mouse,Foucs,Key,Window)

    接着刚刚的事件讲 补充一点:事件的触发前提,添加了这个监听器的组件必须是处于激活状态的才可行 (一)MouseEvent事件 该事件的触发是由鼠标的动作引起的,引起的情况可以是下面5种,按下鼠标,释放 ...

  9. 微信小程序开发:实现高斯模糊效果(毛玻璃效果)

    前言 在微信小程序开发的时候,也会遇到一些和在前端开发一样的样式需求,二者的相通类似性非常的高,就拿样式相关的需求来说,可以说是一模一样的操作.那么本文就来分享一个关于实现高斯模糊效果的需求,微信小程 ...

最新文章

  1. 调整viewState的位置
  2. 物联网 数据驱动企业 如何应对数据洪流
  3. memcached完全剖析
  4. mac 更换默认蓝牙适配器_聊一聊蓝牙名字和地址的来龙去脉
  5. valgrind检测内存泄露
  6. 山山的数学(简单版)
  7. CheckboxPreference 改造
  8. noi题库 1.5编程基础之循环控制 :题解大礼包20180720
  9. 银行账号正则_求一个能验证银行卡号的正则表达式
  10. 测试apk-异常管控NetTraffic攻击者开发
  11. WIN7激活工具拒绝访问cannot open file C:\OEMSF解决方法
  12. 计算机系统应用软件的核心是什么,计算机系统软件的核心是什么?
  13. 福建广电网络显示服务器异常,无法浏览网页故障
  14. 超爆笑段子大集锦 你要不笑我自宫
  15. 完全支持双层PDF!开源的PDF分离与合并软件,C#版本(转自codeproject)
  16. 计算机网络按分布范围分类可分为局域网,计算机网络按照覆盖范围可以分为局域网...
  17. 聚观早报 | ChatGPT 停止 Plus 付费;李子柒油管广告收益登顶热搜
  18. bmp图像文件格式说明
  19. 7、邮箱验证码的功能设计
  20. 定义一个动物类java_Java问题利用接口继承完成对生物、动物、人三个接口的定义,其中生物接口定义呼吸抽象方法,动物接口定义了吃饭和睡觉两个抽...

热门文章

  1. 一副重现赤壁之战的神秘地图
  2. C语言石头剪刀布游戏课设
  3. Matlab 自相关检测 :自相关函数xcorr
  4. 邮票问题(两张邮票)
  5. 虎年,用Python画一个小老虎,祝大家新年虎虎生威,大吉大利
  6. 4.3.2 桥架翻模
  7. HTML5基础实例(三)
  8. 在Ubuntu 20.04上面搭建嵌入式开发环境
  9. uni-app 开发微信公众号(H5)JSSDK 的使用方式
  10. 【4 于博士Cadence SPB15.7 快速入门视频】建立不规则SOIC封装NE5532