delphi - 如何实现 FMX HD 应用放大和缩小?
问题描述
我是 FireMonkey 的新手。最近在用Delphi(FMX)开发一个小2D
游戏,想在鼠标滚轮的时候加上ZOOM-in/out的效果,试过了,搜了Idera的样例和FMX代码,没有任何收获。那么,有没有办法实现 ZOOM 呢?为什么 FMX 不提供易于使用的“比例”属性?FMX 对用户不友好,并且非常缺乏成熟的产品、示例代码和讨论。非常感谢,请原谅我英语不好。
让它变得简单:
File-->New-->Multi-Device Application-->Blank Application
,点击OK,然后我们应该得到一个FMX HD App,我要做的是,当我滚动鼠标时,主窗体的视口可以放大/缩小。
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; var Handled: Boolean);
begin
// ?
end;
抱歉我描述的不好,谢谢!
解决方案
在表单上放置一个TScaledLayout
(在下面命名ScaledLayout1
),并将Align
属性设置为Client
。此外,设置HitTest = True
为在布局的任何位置接收鼠标事件。然后将所有其他控件放在此布局上。
为布局创建一个OnMouseWheel()
事件(如下命名)。ScaledLayout1
ScaledLayout1MouseWheel
在表单上声明一个私有字段
private
StoredWheelDelta: extended;
这是累积滚动量所必需的。
然后为事件编写代码OnMouseWheel()
:
procedure TForm12.ScaledLayout1MouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; var Handled: Boolean);
begin
StoredWheelDelta := StoredWheelDelta + WheelDelta; // accumulate wheeldelta's
ScaledLayout1.Scale.X := (1 + StoredWheelDelta / 120 / 10);
ScaledLayout1.Scale.Y := (1 + StoredWheelDelta / 120 / 10);
end;
值 120 和 10 只是为了将更改缩放到一个合理的值。120 与 10 的典型值相同,WheelDelta
而 10 将变化减少到十分之一。
推荐阅读
- css - react js渲染中的响应按钮
- swift - 将通讯簿联系人图像加载到集合视图单元格
- hadoop - Hortonworks 的 Cloudera Hue 替代品
- json - 如何以编程方式将 JSON 转换为 Swagger YAML?是否有 REST API 可以做到这一点?
- java - 无法将 2 个视频流合并到一个文件中
- kubernetes - 以编程方式覆盖 helm 子图中的值
- javascript - 2个js文件之间的链接
- html - 如何使用检查元素检查/检查任何元素的悬停状态
- ansible - 是否可以通过某些参数覆盖重用 ansible 任务?
- javascript - 为了测试的目的,我如何触发一个可观察对象的下一个?