文档章节

关于动画移动矩形的例子 - 回复 "ps8.0" 同学

涂孟超
 涂孟超
发布于 2014/09/26 15:36
字数 535
阅读 12
收藏 0
点赞 0
评论 0
问题来源: http://www.cnblogs.com/del/archive/2008/06/12/1131232.html#1224216

首先, 实现这个问题有两种方法:

1、边擦边画; 2、先在内存绘图然后再复制到前台, 就是所谓的双倍缓存.

本例使用的是比较传统的 "边擦边画" 法, 但现在更提倡使用 "双倍缓存" 法.

本例效果图(实际的动画效果比这个 gif 要好一些):



代码文件:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  pt1,pt2: TPoint;  {两个点}
  n: Integer = 20;  {用于正方形大小}
  cvs: TCanvas;     {画布}
  a,b,ai,bi: Single;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Enabled := False;
  Timer1.Interval := 25;

  Button1.Caption := '画正方形';
  Button2.Caption := '移动';
  Button3.Caption := '暂停';

  cvs := TCanvas.Create;
  cvs.Handle := GetDC(Handle);

  Self.Color := clWhite;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  {给两个点赋值}
  pt1.X := 30;
  pt1.Y := 30;
  pt2.X := ClientWidth - 30;
  pt2.Y := ClientHeight - 30;

  {记下起始点的位置}
  a := pt1.X;
  b := pt1.Y;

  {算出每次的偏移量}
  ai := (pt2.X-pt1.X)/100; {假如用 100 次移动完毕}
  bi := (pt2.Y-pt1.Y)/100;

  {在第一点位置画出矩形, 使用随机颜色}
  Randomize;
  cvs.Pen.Color := Random($FFFFFF);
  cvs.Pen.Width := 4;
  cvs.Rectangle(Round(a-n), Round(b-n), Round(a+n), Round(b+n));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Timer1.Enabled := True;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Timer1.Enabled := False;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if a >= pt2.X then
  begin
    Timer1.Enabled := False;
    Exit;
  end;

  {擦除上一个}
  cvs.Pen.Mode := pmNotXor;
  cvs.Rectangle(Round(a-n), Round(b-n), Round(a+n), Round(b+n));

  {再画}
  cvs.Pen.Mode := pmCopy;
  a := a+ai;
  b := b+bi;
  cvs.Rectangle(Round(a-n), Round(b-n), Round(a+n), Round(b+n));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  cvs.Free;
end;

end.

 
 
 
 
 

 

 

  
窗体文件:
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 214
  ClientWidth = 335
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poDesktopCenter
  OnCreate = FormCreate
  OnDestroy = FormDestroy
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 252
    Top = 8
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 252
    Top = 39
    Width = 75
    Height = 25
    Caption = 'Button2'
    TabOrder = 1
    OnClick = Button2Click
  end
  object Button3: TButton
    Left = 252
    Top = 70
    Width = 75
    Height = 25
    Caption = 'Button3'
    TabOrder = 2
    OnClick = Button3Click
  end
  object Timer1: TTimer
    OnTimer = Timer1Timer
    Left = 168
    Top = 80
  end
end

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2008/06/13/1218771.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2004
码字总数 14107
作品 0
深圳
程序员
在 SVG 中添加交互性

原文地址:http://www.ibm.com/developerworks/cn/xml/x-svgint/ SVG 中的交互性可以分为三个领域 -- 链接、事件和脚本。本文将依次讨论这三个领域。 注意:要查看本技巧中的 SVG 文档,需要有...

随智阔 ⋅ 2014/03/08 ⋅ 0

iOS动画详解(学习动画看这一篇就够了)

原文出处:wu大维 动效设计一直是iOS平台的优势,良好的动效设计可以很好地提升用户体验。而动画则是动效的基础支撑。本动画将从易到难逐步分析,从CABasicAnimation,UIBezierPath,CAShape...

秦无炎 ⋅ 2016/11/22 ⋅ 0

Axure 制作app侧滑菜单

移动app中关于“菜单”的设计有很多种类,其中侧滑菜单是很常见的一种设计方式,本文以淘宝的筛选菜单为例,使用axure实现效果。 为了节约时间,排除干扰,我们就不拖入其他元件了,直接插入...

狄睿鑫老师 ⋅ 2017/03/29 ⋅ 0

这可能是关于动态面板,最细致的讲解了

作者:拼搏的80后 全文共 2420 字 6 图,阅读需要 5 分钟 ———— / BEGIN / ———— 动态面板是Axure中使用频率最高的元件之一,动态面板专门用于设计原型中的动态功能,它可以包含一个或...

k7jz78gejj ⋅ 04/19 ⋅ 0

干货分享!HTML5 动效的常见制作手法

原文出处:腾讯ISUX - 田田 众所周知,一个元素,动往往比静更吸引眼球; 一套操作界面,合适的动态交互反馈能给用户带来更好的操作体验; 一个H5运营宣传页,炫酷的动画特效定能助力传播和品...

腾讯ISUX - 田田 ⋅ 2015/12/08 ⋅ 0

Android 游戏开发之切换游戏场景特效的实现

大家在玩游戏的时候应该有时候会发现在切换游戏场景的时候 界面会播放一段非常好看的动画 比如一个百叶窗的形式关闭界面 然后在打开界面 效果非常好看 用户体验也非常好,今天我向大家解读游...

无鸯 ⋅ 2011/10/03 ⋅ 3

Android游戏开发之切换游戏场景特效的实现 (十九)

雨松MOMO带你走进游戏开发的世界之切换场景特效 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/details/6667625 大家在玩游戏的...

彭博 ⋅ 2012/03/09 ⋅ 0

Android游戏开发之切换游戏场景特效的实现 (十九)

雨松MOMO带你走进游戏开发的世界之切换场景特效 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/details/6667625 大家在玩游戏的...

晨曦之光 ⋅ 2012/03/07 ⋅ 0

页面动画知识点整理

平时工作中会遇到需要实现一些存在动画的页面。这里对动画的实现知识做一个整理。 页面动画的实现可以分为两类:CSS动画、Canvas动画、JavaScript动画。JavaScript动画没啥好讲的,这里就不整...

chenhao_ch ⋅ 2017/11/29 ⋅ 0

CSS 3D变形动画属性 之逆天立方体叠加动画

上一篇, juejin.im/post/5993d9… 把立方体的盒子搭出来之后,因为怕文章又臭又长(嗯,就是没有想好玩什么效果,偏不告诉你)关于动效没有做更多的处理,只做了一个绕Y轴旋转,这篇试着做几...

泱泱 ⋅ 2017/08/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

分布式数据库中间件DDM的实现原理

随着数据量不断增大,传统的架构模式难以解决业务量不断增长所带来的问题,特别是在业务成线性、甚至指数级上升的情况。此时我们不得不通过水平扩展,把数据库放到不同服务器上来解决问题,也...

中间件小哥 ⋅ 12分钟前 ⋅ 0

字符编码那点事:快速理解ASCII、Unicode、GBK和UTF-8

原作者:阮一峰(ruanyifeng.com),现重新整理发布,感谢原作者的无私分享。 1、引言 今天中午,我突然想搞清楚 Unicode 和 UTF-8 之间的关系,就开始查资料。 这个问题比我想象的复杂,午饭...

JackJiang- ⋅ 19分钟前 ⋅ 0

Spring Cloud构建微服务架构:服务消费(基础)

使用LoadBalancerClient 在Spring Cloud Commons中提供了大量的与服务治理相关的抽象接口,包括DiscoveryClient、这里我们即将介绍的LoadBalancerClient等。对于这些接口的定义我们在上一篇介...

itcloud ⋅ 19分钟前 ⋅ 0

MaxCompute产品最新进展 -- 从马力到计算力

摘要:本文从马力作为功率衡量标准为切入点,介绍了大数据领域的计算力衡量标准TPCBB以及MaxCompute2.0在Big Bench上的卓越表现。同时详细地分享了取得优异成绩背后的产品在最新有哪些进展,...

猫耳m ⋅ 20分钟前 ⋅ 0

Linux系统

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 Linux系统: Unix:是C语言转做出来的,最早的网...

凯哥学堂 ⋅ 20分钟前 ⋅ 0

13.1 设置更改root密码 13.2 连接mysql 13.3 mysql常用命令

13.1 设置更改root密码 启动MySQL数据库 [root@linux-10 ~]# /etc/init.d/mysqld startStarting MySQL SUCCESS! 由于MySQL的相关命令的所在路径不在系统的环境变量中,因此需要将路径添...

影夜Linux ⋅ 23分钟前 ⋅ 0

jeesite shiro+redis实现cache和session共享

jeesite这个开源框架本身集成的有shiro+redis来实现cache和session共享,但是需要修改一下文件配置即可 首先找到spring-context-shiro.xml文件 找到bean id为sessionDAO,将其修改为如下 <!...

wangxujun59 ⋅ 23分钟前 ⋅ 0

基本JNI搭建

1、编写Java代码 首先我们需要编写自己的java代码 public class Hello { static{ System.loadLibrary("hello-jni"); } public native String sayHello();} 2、把...

国仔饼 ⋅ 25分钟前 ⋅ 0

MaxCompute产品最新进展 -- 从马力到计算力

摘要:本文从马力作为功率衡量标准为切入点,介绍了大数据领域的计算力衡量标准TPCBB以及MaxCompute2.0在Big Bench上的卓越表现。同时详细地分享了取得优异成绩背后的产品在最新有哪些进展,...

阿里云云栖社区 ⋅ 29分钟前 ⋅ 0

AppDelegate 设置Root相关

self.window = UIWindow.init(frame: UIScreen.main.bounds) self.window?.backgroundColor = UIColor.white self.window?.makeKeyAndVisible() self.window?.rootViewController = RootTabB......

west_zll ⋅ 37分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部