Asp.Net教程,WinForm教程,Asp.Net MVC,vs2008教程,vs2010教程,Silverlight技术,源码下载,Asp.Net视频教程
全站热门标签
vs2010 Silverlight 存储过程 水晶报表 ADO.NET JavaScript LINQ AjaxPro DataGridView 面向对象 Extjs GridView XML DevExpress HTML教程 Oracle jQuery 分页 GDI+ Visual C++2010 MySQL Office2010 WPF MVC Dojo WCF4.0 VB.NET Sql2005 textbox cookie WCF WinForm Discuz!NT SQL经典语句 T-SQL checkbox ASPxGridView F# asp.net SQL VS2008新特性 DropDownList Access TreeView Ajax VS2008 页面执行时间 Flex 字符串 回调 VB2005 DataSet C#时间 ASP.NET性能优化 用户在线检测 动画
当前位置: 主页 > vs2010教程 >

基于Visual C#2010开发Windows7应用 多点触摸图片处理应用程序(2)-使用多点触摸操作处理图片(3)

时间:2010-07-28 12:47来源:blog.csdn.net/yincheng01 作者:admin 点击:

5.  编译并运行!
 
添加惯性
 
只剩最后一项任务了。使用缩放、平移和旋转操作可以提供一种自然的用户体验。在实际生活中,当推动一个物体,然后松开手时,该物体会继续移动,直到因为无法克服摩擦力而停止。可以使用 Inertia 让我们的图片对象拥有相同的行为。Windows 7 多点触摸子系统提供了一个 InertiaProcessor COM 对象。InertiaProcessor 可以发起与 ManipulationProcessor 相同的操作事件。Windows 7 Integration Library 示例提供了一个包装器,它将操作处理器和惯性处理器捆绑在一起。ManipulationInertiaProcessor 可以替代 ManipulationProcessor 并提供额外的 InertiaProcessor 属性来公开 InertiaProcessor 功能。要发起更多事件,ManipulationInertiaProcessor 需要一个计时器。为了克服线程的 UI 相似性问题,我们最好拥有一个基于 GUI 的计时器。Windows 7 Integration Library 可以为我们创建这样的计时器。
当用户的最后一个手指离开图片对象时,ManipulationInertiaProcessor 会发起 OnBeforeInertia 事件。在这里设置 Inertia 开始参数。可以选择一个默认的开始速度,或者跟踪当前的对象速度并从中提取出速度数字。
1. 我们想要跟踪对象的平移、旋转和缩放速度。将以下类添加到 PictureTracker 类中:

//Keep track of object velocities  
 
private class InertiaParam  
 
{  
 
    public VectorF InitialVelocity { get; set; }  
 
    public float InitialAngularVelocity { get; set; }  
 
    public float InitialExpansionVelocity { get; set; }  
 
    public System.Diagnostics.Stopwatch _stopwatch = new System.Diagnostics.Stopwatch();  
 
    public void Reset()  
 
    {  
 
        InitialVelocity = new VectorF(0, 0);  
 
        InitialAngularVelocity = 0;  
 
        InitialExpansionVelocity = 0;  
 
        _stopwatch.Reset();  
 
        _stopwatch.Start();  
 
    }  
 
    public void Stop()  
 
    {  
 
        _stopwatch.Stop();  
 
    }  
 
    //update velocities, velocity = distance/time  
 
    public void Update(ManipulationDeltaEventArgs e, float history)  
 
    {  
 
        float elappsedMS = (float)_stopwatch.ElapsedMilliseconds;  
 
        if (elappsedMS == 0)  
 
            elappsedMS = 1;  
 
        InitialVelocity = InitialVelocity * history + ((VectorF)e.TranslationDelta * (1F - history)) / elappsedMS;  
 
        InitialAngularVelocity = InitialAngularVelocity * history + (e.RotationDelta * (1F - history)) / elappsedMS;  
 
        InitialExpansionVelocity = InitialExpansionVelocity * history + (e.ExpansionDelta * (1F - history)) / elappsedMS;  
 
        _stopwatch.Reset();  
 
        _stopwatch.Start();  
 
    }  
 

2.  将 OnBeforeInertia() 事件处理程序添加到 PictureTracker 类中:

//Fingers removed, start inertia  
 
void OnBeforeInertia(object sender, BeforeInertiaEventArgs e)  
 
{  
 
    //Tell the tracker manager that the user removed the fingers  
 
    _pictureTrackerManager.InInertia(this);  
 
 
    _processor.InertiaProcessor.InertiaTimerInterval = 15;  
 
    _processor.InertiaProcessor.MaxInertiaSteps = 500;  
 
    _processor.InertiaProcessor.InitialVelocity = _inertiaParam.InitialVelocity;  
 
    _processor.InertiaProcessor.DesiredDisplacement = _inertiaParam.InitialVelocity.Magnitude * 250;  
 
    _processor.InertiaProcessor.InitialAngularVelocity = _inertiaParam.InitialAngularVelocity * 20F / (float)Math.PI;  
 
    _processor.InertiaProcessor.DesiredRotation = Math.Abs(_inertiaParam.InitialAngularVelocity *   
 
    _processor.InertiaProcessor.InertiaTimerInterval * 540F / (float)Math.PI);  
 
    _processor.InertiaProcessor.InitialExpansionVelocity = _inertiaParam.InitialExpansionVelocity * 15;  
 
    _processor.InertiaProcessor.DesiredExpansion = Math.Abs(_inertiaParam.InitialExpansionVelocity * 4F);  
 

3.  更改 PictureTracker 类,创建 ManipulationInertiaProcessor 并注册 OnBeforeInertia 事件:

class PictureTracker  
 
{  
 
...  
 
    //Calculate the Inertia start velocity  
 
    private readonly InertiaParam _inertiaParam = new InertiaParam();  
 
    private readonly ManipulationInertiaProcessor _processor = new ManipulationInertiaProcessor(ProcessorManipulations.ALL, Factory.CreateTimer());  
 
    public PictureTracker(PictureTrackerManager pictureTrackerManager)  
 
    {  
 
        _pictureTrackerManager = pictureTrackerManager;  
 
        //Start inertia velocity calculations  
 
        _processor.ManipulationStarted += (s, e) =>  
 
        {  
 
            _inertiaParam.Reset();  
 
        };  
 
        //All completed, inform the tracker manager that the current tracker  
 
        //can be reused  
 
        _processor.ManipulationCompleted += (s, e) =>   
 
        {   
 
            _inertiaParam.Stop();   
 
            pictureTrackerManager.Completed(this);   
 
        };  
 
        _processor.ManipulationDelta += ProcessManipulationDelta;  
 
        _processor.BeforeInertia += OnBeforeInertia;  
 
    }  
 
... 
 

4. 我们还需要更改 PictureTrackerManager。在新的条件下,图片可能由惯性处理器使用,即使没有手指在触摸该对象。我们需要在操作完成时立即从映射中删除触摸 ID,但是只有在惯性处理器使图片完全停止时,我们才能够重用 PictureTracker 对象。将 InInertia() 函数添加到 PictureTrackerManager 类中:

public void InInertia(PictureTracker pictureTracker)  
 
{  
 
    //remove all touch id from the map  
 
    foreach (int id in 
 
        (from KeyValuePair<int, PictureTracker> entry in _pictureTrackerMap  
 
         where entry.Value == pictureTracker  
 
         select entry.Key).ToList())  
 
    {  
 
        _pictureTrackerMap.Remove(id);  
 
    }  
 

 

5.  编译并运行。尝试将图片拉出屏幕。试验各种 Inertia 参数,看它们如何更改图片行为。
 
在此改进了一个基于鼠标的简单图片处理应用程序,将它升级成了类似于 Surface 的成熟的图片操作应用程序。
(责任编辑:admin)
Tags:图片处理 C#2010
责任编辑:admin
返回顶部
------分隔线----------------------------
推荐内容
骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价 骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价