Перейти к содержанию
Fire Monkey от А до Я
  • 0

[Андроид] TAniIndicator


Anatoliy

Вопрос

Если задать размеры для TAniIndicator для платформы Windows, то все работает. Для платформы Андроид TAniIndicator, игнорирует размеры в инспекторе объектов и выглядит всегда как маленький крутящийся кружок. Как для платформы Андроид увеличить диаметр TAniIndicator? IDE Берин все апдейты.

Спасибо.

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

У меня на винде все Ок. Растягиваю размер - все нормально. На Андроиде вижу фиксированный размер...

Берлин.

 

Изменено пользователем Anatoliy
Ссылка на комментарий
  • 0

Да, на берлине как-то тянулось, помню-помню. На токио - нет.

И ни на одной платформе не желает линейное отображение принимать. На ситэтле вроде как корректнее всё было.

Ссылка на комментарий
  • 0

Я рисовал дугу, которая при вращении растягивается/сжимается с помощью TFloatAnimation и меняет цвет после каждого оборота. Вроде векторного подхода, норм для любого разрешения экрана.

Ссылка на комментарий
  • 0

Может быть вам пригодится - мой пример векторного подхода к AniIndicator без использования картинок и для различных разрешений экрана.

Для отрисовки дуги использовал компонент Равиля на основе FMX.Graphics.Native, поскольку стандартные функции не красиво рисуют под Андроидом.

Сам индикатор:

unit newaniindicator;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Ani,
  FMX.Objects, FMX.Layouts, FMX.ZNativeDrawFigure;

type
  TNewAniIndicator = class(TZNativeDrawFigureArc)
    Animation: TFloatAnimation;
    procedure AnimationProcess(Sender: TObject);
    procedure AnimationFinish(Sender: TObject);
    procedure IndicatorResize(Sender: TObject);
    procedure Start;
    procedure Stop;
    Constructor Create(AOwner: TComponent); override;
    Destructor Destroy; override;
    private
        active: boolean;
    public
        colors: array of TAlphaColor;
  end;


implementation

constructor TNewAniIndicator.Create(AOwner: TComponent);
begin
    inherited Create(AOwner);
    Fill.Kind:=TBrushKind.None;
    Stroke.Cap:=TStrokeCap.Round;
    Stroke.Join:=TStrokeJoin.Round;
    Animation:=TFloatAnimation.Create(Self);
    with Animation do begin
        Parent:=Self;
        Duration:=1;
        StartValue:=-90;
        StopValue:=270;
        PropertyName:='StartAngle';
        Interpolation:=TInterpolationType.Quadratic;
        OnProcess:=AnimationProcess;
        OnFinish:=AnimationFinish;
    end;
    OnResize:=IndicatorResize;
end;

destructor TNewAniIndicator.Destroy;
begin
    Animation.Free;
    inherited;
end;

procedure TNewAniIndicator.IndicatorResize(Sender: TObject);
begin
    Stroke.Thickness:=Width*0.1;
end;

procedure TNewAniIndicator.Start;
begin
    active:=true;
    Stroke.Color:=colors[0];
    Visible:=true;
    Animation.Start;
end;

procedure TNewAniIndicator.Stop;
begin
    active:=false;
    Visible:=False;
    Animation.Stop;
end;

procedure TNewAniIndicator.AnimationProcess(Sender: TObject);
begin
    EndAngle:=-0.0037*sqr(StartAngle)+0.667*StartAngle+90; //Функция сжатия/растяжения дуги
end;

procedure TNewAniIndicator.AnimationFinish(Sender: TObject);
var i: byte;
begin
    if active then begin
        i:=0; while colors[i] <> Stroke.Color do inc(i);
        if i=length(colors)-1 then Stroke.Color:=colors[0] else Stroke.Color:=colors[i+1];
        Animation.Start;
    end;
end;
end.

Далее в программе:

    ani:=TNewAniIndicator.Create(form1);
    with ani do begin
        Parent:=Form1;
        Width:=Form1.Width*0.2;
        Height:=Width;
        setlength(colors,6);
        colors[0]:=TAlphaColors.Red;
        colors[1]:=TAlphaColors.Orange;
        colors[2]:=TAlphaColors.Yellow;
        colors[3]:=TAlphaColors.Green;
        colors[4]:=TAlphaColors.Blue;
        colors[5]:=TAlphaColors.Violet;
        Start;
    end;

newaniindicator.zip

Изменено пользователем Alex7wrt
Ссылка на комментарий
  • 0

Видимо движок форума кардинально изменился. Пропала возможность поставить плюс СПАСИБО.

Спасибо. Буду изучать и пробовать.

P.S.

Цитата

Для отрисовки дуги использовал компонент Равиля

Проблема  в том, что используется С++ Builder и проект уже полностью готов. При установке новых компонентов в среду С++ Builder, по опыту, наверняка вылезит куча проблем, если компонент не дуален и для Дельфи и для С++. :(

Ссылка на комментарий
  • 0
  • Администраторы
13 часа назад, Anatoliy сказал:

Видимо движок форума кардинально изменился

Восстановили этй функцию.

Ссылка на комментарий
  • 0

Ярослав, а вот то, что TAniIndicator, игнорирует размеры заданные в инспекторе обектов для платформы Андроид, это баг или не понимание мною FMX для мобильной разработки?

С++ Builder Berlin все апдейты.

Изменено пользователем Anatoliy
Ссылка на комментарий
  • 0
  • Администраторы

Он использует  фиксированный размер. Это зависит от стиля. В данном случае стиль для Андроида и йос именно фиксированного размера. Связано это прежде всего с тем, что эти стили растровые. Если вы хотите снять это ограничение, вы можете отредактировать дефолтный стиль и сбросить значения FixedWidth и FixedHeight.

Ссылка на комментарий
  • 0

А что значит сбросить? Я вместо 0 поставил, например, 200. Компонент стал весь 200х200. Но крутилка в центре не масштабируется.

 

P.S. Сорри, WrapMode = Stretch помогло

Изменено пользователем POV
Ссылка на комментарий
  • 0
В 08.12.2017 в 12:22, Alex7wrt сказал:

Тогда TZNativeDrawFigureArc замените на TArc. Может на ваших целевых устройствах будет нормально отрисовываться.

Простите мою безграмотность, где взять модуль FMX.ZNativeDrawFigureArc?

Ссылка на комментарий
  • 0

Равиль Зарипов написал модуль для ровной отрисовки под Android, который здесь используется. Поищите по запросу

FMX.ZNativeDrawFigure
Изменено пользователем Alex7wrt
Ссылка на комментарий
  • 0
  • Модераторы
21 час назад, Виталий Биньковский сказал:

Простите мою безграмотность, где взять модуль FMX.ZNativeDrawFigureArc?

https://github.com/rzaripov1990/ZMaterialComponents

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...