C#winform版 《仿360杀毒》页面切换动画效果

昨天跟一个同事聊天,谈到了360杀毒的页面效果不错,我们所做的winform页面都是拖控件还是拖控件,不能吸引客户的注意力,想改成360的样式。

今天活不多,抽空仿做了两个360杀毒的页面切换效果,其实原理很简单,这里分享出来,希望能给大家带来帮助。

期间滑动的时候,窗体是不能拖动或者点击其他的功能,这里可能是用了单线程进行了页面切换。

滑动效果

“功能大全功能”的切换效果是右到左滑入,从最右侧,迅速往左侧滑入,当快要完成切换时,有个稍微停顿的效果,接着缓冲效果到页面完全显示。

页面进入部分

页面退出时,也是右侧到左侧滑出,和滑入一样,前期是迅速往左侧滑出,当快要完成切出时,也是有个稍微的停顿效果,接着缓冲效果到页面完全消失。

页面移出部分

这个动画效果,用单线程实现就好了,实例化滑动的窗体,初始化窗体原坐标为窗口最右侧(form.Width,0),之后使用for,while,Timer,BackgroundWork等等都可以。

我这里用了While进行单线程切换:

        private void AnimationX(Control ctrl, int x, int milliseconds){Point startPoint = ctrl.Location;int vector = x >= ctrl.Location.X ? 1 : -1;int length = Math.Abs(startPoint.X - x);if (Math.Abs(vector * length) > milliseconds)vector = vector * length / milliseconds;while ((ctrl.Location.X - x) > 0){ctrl.Location = new Point(ctrl.Location.X + vector, ctrl.Location.Y);Application.DoEvents();if (x < 0)System.Threading.Thread.Sleep(5);}ctrl.Location = new Point(x, ctrl.Location.Y);}

上下分页效果

“查杀功能”的切换效果是上下分离,页面从中间横线出分裂开,上部分向上打开,下半部分向下打开,最后显示第二个页面,这样完成了页面的切换功能。

这里如果在用单线程的话,就会出现,先上半部分向上打开后,在下半部分向下打开,这样不能够实现上下部分同时打开效果,如果在同一个方法内操作两个部分,这样就会是代码出现冗余情况。你不觉得这样写很不好吗,而且维护的话也很难,看起来也有点费劲是吧。呵呵 ^ ^

这里我用了BackgroundWork:

动画方法:

        private void AnimationY(Control ctrl, int y, int milliseconds, bool IsUp){Point startPoint = ctrl.Location;int vector = y >= ctrl.Location.Y ? 1 : -1;int length = Math.Abs(startPoint.Y - y);if (Math.Abs(vector * length) > milliseconds)vector = vector * length / milliseconds;while ((IsUp && (ctrl.Location.Y + vector) > y) || (!IsUp && (ctrl.Location.Y + vector) < y)){ctrl.Location = new Point(ctrl.Location.X, ctrl.Location.Y + vector);System.Threading.Thread.Sleep(10);Application.DoEvents();}ctrl.Location = new Point(ctrl.Location.X, y);}

上半部分的BackgroundWork:

        private void bgwTop_DoWork(object sender, DoWorkEventArgs e){int[] tem=e.Argument as int[];int Y = tem[0];int y = tem[1];int milliseconds = tem[2];bool IsUp = Convert.ToBoolean(tem[3]);int vector = y >= tem[0] ? 1 : -1;int length = Math.Abs(Y - y);if (Math.Abs(vector * length) > milliseconds)vector = vector * length / milliseconds;while ((IsUp && (Y + vector) > y) || (!IsUp && (Y + vector) < y)){bgwTop.ReportProgress(Y + vector, null);System.Threading.Thread.Sleep(25);//Application.DoEvents();Y=Y + vector;}bgwTop.ReportProgress(y, null);}private void bgwTop_ProgressChanged(object sender, ProgressChangedEventArgs e){this.lblTop.Location = new Point(this.lblTop.Location.X, e.ProgressPercentage);}

下半部分的BackgroundWork:

        private void bgwBottom_DoWork(object sender, DoWorkEventArgs e){int[] tem = e.Argument as int[];int Y = tem[0];int y = tem[1];int milliseconds = tem[2];bool IsUp = Convert.ToBoolean(tem[3]);int vector = y >= tem[0] ? 1 : -1;int length = Math.Abs(Y - y);if (Math.Abs(vector * length) > milliseconds)vector = vector * length / milliseconds;while ((IsUp && (Y + vector) > y) || (!IsUp && (Y + vector) < y)){bgwBottom.ReportProgress(Y + vector, null);System.Threading.Thread.Sleep(25);//Application.DoEvents();Y = Y + vector;}bgwBottom.ReportProgress(y, null);}private void bgwBottom_ProgressChanged(object sender, ProgressChangedEventArgs e){this.lblBottom.Location = new Point(this.lblBottom.Location.X, e.ProgressPercentage);}

作品效果图:

消除动画闪现

最后看过效果图后,是不是发现中间闪烁现象是不是很严重,不急这里我们在构造里面加上一句话就OK了。

            // 设置控件 双缓冲开启this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

来,在自己的作品里添加上来看看效果吧。

源代码下载

开博第一篇作品-C#winform版《仿360杀毒》页面切换动画效果(内含源码)相关推荐

  1. 开博第一篇 往后余生,唯愿你幸福

    开博第一篇 --------十年相思伊人去,QQ不在微信来 我想轻轻的问候你一声 忙碌中的你过得还好吗 其实我过的不好 但我希望你过得好 没有你的日子 其实我活的很累 但我希望你活得轻松 没有你的日子 ...

  2. 开博第一篇:写在前面,一名阿里程序员的永恒生命追求之路

    想写这个文章很久了,几次起笔,冥想,叹几口气后都是无奈的放下.自己不是一个擅长写文章的人,不知道内心的这些想法和决定的思路该怎么去表达和描述.然而路总是要走的,远方依旧遥远,在三十岁的当下,方向远比速 ...

  3. 在CSDN开博第一篇,以及之前在百度空间的一些文章

    2008年4月研一在读的时候,在百度空间开了一个技术类博客,写了七八十篇文章,主要记录了自己自学以及在企业实习时候的一些经验总结.但从2010年开始,由于各种原因,就很少再写博客了.而且发现百度空间越 ...

  4. 不试过你怎么知道?开博第一篇(本人菜鸟也,高手可以飘过)

    我是菜鸟,一直都是,只不过以前比现在更菜而已. 注册博客园居然有5个月了.昨晚看过一位迷茫中的仁兄30岁了不知道干什么..我跟他差不多. 既然他可以申请开博,为什么我就不试试看呢? 试试看又不会损失什 ...

  5. 51CTO开博第一篇:信仰和领导力(读书感悟)

    平安夜开博是个好日子吧~ 我这么想着,就开始写了. 最近感触最深的是看了两本书,<写给上班族的世界史>上下. 为什么说感触最深,因为这样的事儿之前没听过,现实中没见过. 一是宗教对人的影响 ...

  6. 开博第一篇 近来心得

    一点想法 很早在收集资源的时候,便接触过csdn,一些其他地方不能收集到的软件,在这里都能下载到,开始的时候积分还容易获得一点,再后来只能望尘莫及. 还记得12年时在文库找ppt学c语言数据结构的时日 ...

  7. VMware Workstation7.1新版特性测试(开博第一篇)

    vmwrae官方于25日放出了vmwrae workstation7.1最新版本 本着服务大家,体验最新的理念.抱着不怕死机,不怕蓝屏,不怕重装的态度,开始了测试. 在大家往下看之前,还是要啰嗦下啊, ...

  8. 开博第一篇,申请博客的理由

    随着学习的不断深入,开个博客的想法越来越强烈.一来是想记录成长道路上的一些学习笔记,以便日后整理复习和交流学习:二来是想记录在实践中遇到的种种问题,以及相应的解决方法,以便自己或他人遇到类似的问题能够 ...

  9. 开博第一篇,附上我开通博客的理由

    作为一个计算机专业的学生,虽然本科学的是计算机,但是很多东西还只是停留在书本上对知识的认识,一年的前端工作经验,让我学到了很多,也让我明白了博客的重要性,开通博客只是为了梳理一下自己的知识,完善自己的 ...

最新文章

  1. 第二届Bio-protocol生物实验短视频大赛作品征集开始 | 奖品丰厚,等你来拿
  2. UnicodeEncodeError: 'ascii' codec can't encode character '\xe3' in position 0: ordinal not in range
  3. 再来一次的C语言贪吃蛇小游戏(一)
  4. Python程序员面试牢记这些,助你闯关成功!
  5. OpenCV形态转换Morphology Transformations
  6. 播放生成Android4.0.3中的提示音
  7. 污染物在线自动监控(监测)系统数据传输标准 (HJ212-2017)-空气质量监测数据包构造...
  8. JavaScript中对象的比较
  9. Cocos数据篇[3.4](3) ——XML数据操作
  10. Autorun.inf病毒和qhbpriAppInit_DLLs专杀
  11. 考研数学 曲线曲面积分
  12. 栈区的使用规则、压栈和出栈、栈区先进后出,后进先出
  13. 掘金 AMA:听蚂蚁金服高级技术专家-- 章耿谈微服务、架构、日志那些事
  14. WIFI热点软件测试,用手机WiFi热点已OUT 华为随行WiFi Plus评测
  15. Python3获取拉勾网招聘信息的方法实例
  16. Linux Kernel Security全景图系列之开篇
  17. excel怎么固定住一行和一列
  18. Python中使用BeautifulReport形成测试报告教程
  19. 关于error C2065 错误
  20. svn提交代码报错:A conflict in the working copy obstructs the current operation,解决办法

热门文章

  1. 老生常谈:项目管理之时间管理
  2. 如何更改计算机里卷标的顺序,怎么修改磁盘的卷标|磁盘的卷标怎么设置
  3. 让多个div并列显示在一行|并列div
  4. jlink怎么调试linux程序_使用jlink+gdbserver+insight调试ARM程序--配置insight
  5. 一文了解27市5G建设最新进展与规划
  6. 设置VIM以便于编写C语言
  7. matlab dms2degrees,Convert degrees-minutes to degrees
  8. 以前的互联网时代,其实就是一个以互联网技术为主导的年代
  9. leetcode:2085. 统计出现过一次的公共字符串
  10. train-images-idx3-ubyte.gz train-labels-idx1-ubyte.gz 下载