Firemonkey如何实现app抽屉式选项卡控件

时间:2015-06-11 19:36:51

标签: firemonkey horizontal-scrolling

我正试图解决这个问题。 基本上我的Firemonkey安卓应用程序上有一个标签控件,可以向左或向右滑动以更改选项卡,它可以正常工作。

我想加强刷卡,所以它的行为更像是android app抽屉。我的意思是,如果你长时间向左或向右慢慢滑动手指,屏幕内容会用手指向左/向右移动,而不是我现在所拥有的,它一次只能移动整个屏幕,而不是在手指下方慢慢移动

THorzScrollBox接近我想要的效果,但它不会“捕捉”到单个屏幕上,而是可以将屏幕的一半和两半留在两页上。

我在这里有意义吗?

我正在使用XE8,但我无法在早期版本上使用它!

非常感谢,

伊恩。

2 个答案:

答案 0 :(得分:0)

如果有人感兴趣,我刚刚创建了一个新的TTabcontrol来增强刷卡

您可以在此处查看代码来源 (svn)https://svn.code.sf.net/p/alcinoe/code/

,演示在这里: (svn)https://svn.code.sf.net/p/alcinoe/code/demos/ALFmxControls

欢迎任何评论 :)

我还继续我的逻辑:创建一套firemonkey控件,他们画得非常快,独立于OpenGL而且不适合这种风格(我发现firemonkey中的风格非常低效且维护起来非常复杂),所以我创建这个tabcontrol作为Tcontrol的后代,而不是作为TStyleControl的后代。

我觉得使用像trectangle + ttext这样的基本组件来创建标签的标题(即:按钮)要比为每个平台更新如此复杂的Stylebook(ioe,android,windows,macos,等)

如果你将我的Tabcontrol(ALFmxTabControl.pas)的单位与delphi TabControl(Fmx.TabControl.pas)的单位进行比较,那么你会发现我使用的代码行数减少了3.5倍(1018对3550),更少的代码行=总是更好

请在此投票支持此功能请求: https://quality.embarcadero.com/browse/RSP-15576

答案 1 :(得分:0)

尝试THorzScrollBox.AniCalculations.SetTargets(...)

例如

1.打开FMX.HorizontalScroll Sample : CPP\Mobile Snippets\HorizontalScroll

2.添加表单事件:OnResize

3.编写代码:

#include <FMX.InertialMovement.hpp>
void __fastcall THorizontalScrollForm::FormResize(TObject *Sender)
{
    TAniCalculations::TTarget target[4];

    // Set ths size and position of your slides.
    Image1->SetBounds(0, 0, HorzScrollBox1->Width, HorzScrollBox1->Height);
    Image2->SetBounds(HorzScrollBox1->Width, 0, HorzScrollBox1->Width, HorzScrollBox1->Height);
    Image3->SetBounds(HorzScrollBox1->Width*2, 0, HorzScrollBox1->Width, HorzScrollBox1->Height);
    Image4->SetBounds(HorzScrollBox1->Width*3, 0, HorzScrollBox1->Width, HorzScrollBox1->Height);

    // Assign the check point(your slides' top-left conner).
    target[0].TargetType = TAniCalculations::TTargetType::Other;
    target[0].Point = TPointD(1, 0);
    target[1].TargetType = TAniCalculations::TTargetType::Other;
    target[1].Point = TPointD(HorzScrollBox1->Width, 0);
    target[2].TargetType = TAniCalculations::TTargetType::Other;
    target[2].Point = TPointD(HorzScrollBox1->Width*2, 0);
    target[3].TargetType = TAniCalculations::TTargetType::Other;
    target[3].Point = TPointD(HorzScrollBox1->Width*3, 0);
    HorzScrollBox1->AniCalculations->SetTargets(target, 3);
}