delphi Image 32 动画演示1
Image 32 自带的Demo,添加一些注解。
unit uFrmAnimation;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes,
System.Variants, System.Math, Vcl.Graphics, Vcl.Controls, Vcl.Forms,
Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, //
Img32, Img32.Layers;
type
TfrmAnimation = class(TForm)
Panel1: TPanel;
btnDec: TButton;
btnAdd: TButton;
lblSpeed: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure btnAddClick(Sender: TObject);
procedure btnDecClick(Sender: TObject);
private
timer: TTimer; // 定时器,刷新动画
reversing: Boolean; // 颠倒
imgIndex: integer; // 动画图片索引
layeredImage: TLayeredImage32; // 图片分层对象 Image32 (对象存储)
drawRec: TRect;
procedure Timer1Timer(Sender: TObject);
protected
procedure WMERASEBKGND(var message: TMessage); message WM_ERASEBKGND;
public
end;
var
frmAnimation: TfrmAnimation;
implementation
{$R *.dfm}
uses
Img32.Draw, Img32.Vector, Img32.Extra;
{ TfrmAnimation }
procedure TfrmAnimation.btnAddClick(Sender: TObject);
begin
timer.Interval := Max(1, timer.Interval div 2);
end;
procedure TfrmAnimation.btnDecClick(Sender: TObject);
begin
timer.Interval := Max(1, timer.Interval * 2);
end;
procedure TfrmAnimation.FormCreate(Sender: TObject);
var
i, j, ballsize, SpaceAbove, maxSquishSize: integer;
img: TImage32;
path: TPathD;
ballRec: TRect;
begin
ballsize := DPIAware(100); // 球大小, 根据屏幕分辨率缩放“值”(即屏幕像素/英寸或“点/英寸”)。(请参阅Windows操作系统设置|系统|显示|缩放和布局。)提供了一种实现图像和控件大小一致的�
SpaceAbove := ballsize * 2; // 上方空间大小
drawRec := Img32.Vector.Rect(0, 0, ballsize, ballsize + SpaceAbove); // 绘制区域 (0,0,100,300)
layeredImage := TLayeredImage32.Create;
layeredImage.SetSize(ballsize, ballsize + SpaceAbove); // 与绘制区域大小相同
layeredImage.BackgroundColor := Color32(self.Color); // clBtnFace);
// path: for drawing a black line at the bottom of the image
path := Img32.Vector.MakePath([0, ballsize * 3 - 8, ballsize, ballsize * 3 - 8]); // 下方的线条
with layeredImage.AddLayer(TLayer32) do // 添加一个层图形对象
begin
SetInnerBounds(RectD(drawRec)); // 设置绑定区域
DrawLine(Image, path, 5, clBlack32, esSquare); // Img32.Draw.DrawLine 画线 5为线宽
end;
ballRec := Img32.Vector.Rect(0, 0, ballsize, ballsize); // 球的区域
Winapi.Windows.InflateRect(ballRec, -15, -15); // 扩展区域(负数为缩小)
path := Ellipse(ballRec); // Img32.Vector.Ellipse //㮋圆(长宽相等为圆)
// 31 images (25 + 6) will be added to masterImageList. Each will be viewed 31个图像(25+6)将被添加到masterImageList。每个都将被查看
// twice in each loop except for the top and bottom images. (60 frames/loop) 除了顶部和底部图像之外,每个循环中两次。(60帧/循环)
img := TImage32.Create(ballsize, ballsize);
try
// draw the ball
DrawPolygon(img, path, frNonZero, clLime32); // 绘制多边形(填充)
Draw3D(img, path, frNonZero, 8, 8); // 使填充区域具有3D效果
DrawLine(img, path, 3, clGreen32, esPolygon); // 绘制线(此外为圆的边框)
// 以下是直接(球无变形,只是位置变化)
for i := 1 to 25 do
begin
with layeredImage.AddLayer(TLayer32) do
begin
SetInnerBounds(RectD(drawRec));
j := Round(power(SpaceAbove, i / 25));
ballRec := Img32.Vector.Rect(0, j, ballsize, j + ballsize);
Image.CopyBlend(img, img.Bounds, ballRec); // 源 完整拷贝到 目标位置
Visible := false; // 默认此层都是隐藏的.
end;
end;
// 以下是直接(球有变形,目标区域高度变小)
maxSquishSize := Round(ballsize * 0.75);
for i := 1 to 6 do
with layeredImage.AddLayer(TLayer32) do
begin
SetInnerBounds(RectD(drawRec));
ballRec := Img32.Vector.Rect(0, SpaceAbove + maxSquishSize - Round(power(maxSquishSize, (6 - i) / 6)), ballsize, SpaceAbove + ballsize);
Image.CopyBlend(img, img.Bounds, ballRec);
Visible := false; // 默认此层都是隐藏的.
end;
finally
img.Free;
end;
// 创建,启动定时器
timer := TTimer.Create(self);
timer.OnTimer := Timer1Timer;
timer.Interval := 15;
timer.Enabled := true;
end;
procedure TfrmAnimation.FormDestroy(Sender: TObject);
begin
layeredImage.Free;
timer.Free;
end;
procedure TfrmAnimation.FormPaint(Sender: TObject);
begin
with layeredImage.GetMergedImage do //获取合并的图像(只有图层显示状态的才参与合并)
CopyToDc(Bounds, Canvas.Handle, drawRec.Left, drawRec.Top, false);
end;
procedure TfrmAnimation.FormResize(Sender: TObject);
begin //当窗口大小发生变化时,要重新计算绘制区域位置
if csDestroying in ComponentState then
Exit;
// repaint the whole background only when resizing. 只有在调整大小时才能重新绘制整个背景。
Canvas.FillRect(ClientRect);
// center the animation in the form clientrect 将动画置于窗口显示区域的中心
Img32.Vector.TranslateRect(drawRec, // 修改 drawRec
-drawRec.Left + (ClientWidth - layeredImage.Width) div 2, //
-drawRec.Top + (ClientHeight - layeredImage.Height) div 2); //
end;
procedure TfrmAnimation.Timer1Timer(Sender: TObject);
begin
if imgIndex > 0 then //当前绘制的图层索引
layeredImage[imgIndex].Visible := false; //此层不显示
// 计算当前应该显示哪张图片
if reversing then //是否颠倒
begin
dec(imgIndex);
if (imgIndex = 1) then
reversing := false;
end
else
begin
inc(imgIndex);
if (imgIndex = layeredImage.Count - 1) then
reversing := true;
end;
layeredImage[imgIndex].Visible := true; //当前层显示
Invalidate; //使窗口无效(即要求重新绘制窗口)
end;
procedure TfrmAnimation.WMERASEBKGND(var message: TMessage);
begin
message.Result := 1;
// this stops windows unhelpfully erasing the form's canvas. 这将阻止windows毫无帮助地擦除窗体的画布。
// We want full control of painting (see FormPaint below). 我们希望完全控制绘画(请参阅下面的FormPaint)
end;
end.
效果:

欢迎微信搜一搜 IT软件部落 关注公众号,你可以了解更详细的内容

欢儿微信扫码关注 IT软件部落 公众号,你可以了解更详细的内容

delphi Image 32 动画演示1的更多相关文章
- 【动画】JQuery实现冒泡排序算法动画演示
1 前言 冒泡排序是大家最熟悉的算法,也是最简单的排序算法,因其排序过程很象气泡逐渐向上漂浮而得名.为了更好的理解其基本的思想,毛三胖利用JQuery实现了冒泡排序的动画演示,并计划陆续实现其它排序算 ...
- Visaul Studio 常用快捷键的动画演示
从本篇文章开始,我将会陆续介绍提高 VS 开发效率的文章,欢迎大家补充~ 在进行代码开发的时候,我们往往会频繁的使用键盘.鼠标进行协作,但是切换使用两种工具会影响到我们的开发速度,如果所有的操作都可以 ...
- 免费的精品: Productivity Power Tools 动画演示
Productivity Power Tools 是微软官方推出的 Visual Studio 扩展,被用以提高开发人员生产率.它的出现一定程度上弥补和完善了 Visual Studio 自身的不足, ...
- Productivity Power Tools 动画演示(转)
Productivity Power Tools 是微软官方推出的 Visual Studio 扩展,被用以提高开发人员生产率.它的出现一定程度上弥补和完善了 Visual Studio 自身的不足, ...
- 【转载】Visaul Studio 常用快捷键的动画演示
在进行代码开发的时候,我们往往会频繁的使用键盘.鼠标进行协作,但是切换使用两种工具会影响到我们的开发速度,如果所有的操作都可以只用键盘来完成,那开发效率将得到大幅度的提升.因此,灵活地应用 Visua ...
- Productivity Power Tools 动画演示--给力的插件工具
免费的精品: Productivity Power Tools 动画演示 Productivity Power Tools 是微软官方推出的 Visual Studio 扩展,被用以提高开发人员生产率 ...
- delphi 2010是动画GIF的支持方法
下面delphi 2010是动画GIF的支持方法: 1.在窗体上放一个Image1控件.注意:这时设置其Picture属性,加载一幅动画GIF是不会动画显示的. 2.在窗体的FormCreate事 ...
- jQuery each、节点操作、动画演示、尺寸操作、扩展方法
一.each 1.方式一:$.each(数组或者自定义对象,function(i,j){console.log(i,j)}) $.each(li,function(i,j){ console.log( ...
- 如何用 Keynote 制作动画演示(转)
原文:如何用 Keynote 制作动画演示 Keynote 里的很多特效可以用来制作效果不错的演示,一页页的将需要演示的内容交代清楚后,直接输出成 m4v 的视频格式,为了方便贴到博客或者发布到 Tw ...
- DELPHI纤程的演示
DELPHI纤程的演示 DELPHI7编译运行通过. 纤程实现单元: unit FiberFun; //Fiber(纤程测试Demo)//2018/04/11//QQ: 287413288 //参考 ...
随机推荐
- macOS 查看网络接口信息
networksetup -listallhardwareports 执行结果: Hardware Port: Ethernet Adapter (en4) Device: en4 Ethernet ...
- pikachu靶场 暴力破解(验证码绕过 on server)
先随便输入账号和密码.验证码,来判断前端是否对验证码进行判断对错 先随便输入账号和密码不输入验证码,来判断前端是否允许验证码留空 先随便输入账号和密码,输入正确的验证码,来判断账号和密码是否存在 1. ...
- Java并发之volatile关键字内存可见性问题
Java并发之volatile关键字内存可见性问题 线程之间数据共享案例 我们先来看一个场景: Main函数启动后,调用一个线程向list中添加数据.List的size为5的时候,设置变量flag为t ...
- python pyqt6 设定logo图标
如果是Window self.setWindowIcon(QIcon(get_icon('logo.png'))) 如果是Dialog self.login_dialog.setWindowIcon( ...
- RabbitMQ核心概念以及工作原理【转】
RabbitMQ核心概念以及工作原理 我们来看看流行的RabbitMQ消息系统以及它是如何让你的系统之间进行解耦的. 英文原文 RabbitMQ 在这篇短文里,我们会介绍什么是RabbitMQ,它 ...
- 【YashanDB数据库】YashanDB如何回收表空间
确认表空间高水位线,是否有可回收空间. select a.tablespace_name,a.high_water_mark,b.user_bytes,b.total_bytes from (SELE ...
- 【YashanDB知识库】用户密码带@字符时exp和imp无法使用
[问题分类]数据导入导出 [关键字]YAS-00404.数据导入导出.密码.特殊字符@.exp.imp [问题描述] 当用户密码带@字符时,使用exp和imp导入导出数据,使用转义符仍然出现报错 且y ...
- MVCC能否解决幻读?
一.什么是MVCC 多版本控制: 指的是一种提高并发的技术.最早的数据库系统,只有读读之间可以并发,读写,写读,写写都要阻塞.引入多版本之后,只有写写之间相互阻塞,其他三种操作都可以并行,这样大幅度提 ...
- Angular 18+ 高级教程 – Naming Conversion
前言 命名规范对项目维护是很重要的. Angular 对项目的渗透很大的, 必须做好命名规范, 不然会很乱. InjectionToken InjectionToken = UPPER_SNAKE_C ...
- Go runtime 调度器精讲(五):调度策略
原创文章,欢迎转载,转载请注明出处,谢谢. 0. 前言 在 第四讲 我们介绍了 main goroutine 是如何运行的.其中针对 main goroutine 介绍了调度函数 schedule 是 ...