• 0
Anatoliy

[Андроид] TAniIndicator

Вопросы

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

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 ответов на этот вопрос

  • 0

У меня и на винде не желает масштабироваться. Понятно, что они на растре сделан, но пусть хоть с ухудшением качества его можно было увеличить, Так фиг там.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

Берлин.

 

Изменено пользователем Anatoliy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

 Посоветуйте, чем правильнее будет заменить TAniIndicator, чтобы иметь что-то крутящиеся на андроида с нужным размером.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
13 часа назад, Anatoliy сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

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

Изменено пользователем Anatoliy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

 

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

Изменено пользователем POV

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

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

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