Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.09.2017, 20:20   #1
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию Android Multi-touch

Привет, работаю с XE 10 столкнулся с такой проблемой: не могу управлять двумя компонентами сразу, сперва думал что поддержка мульти тача просто отключена, но нет, форма распазнает хоть все 10 пальцев, а компоненты (ArcDial и TrackBar) не хотят работать одновременно, подскажите как их переубедить?

P.S. нашел способ создать свои компоненты, неужели это единственный способ?

P.S. способ который помог в моем случае, работает он по такой логике:
на форме лайаут, на нем линия пунктиром или точкой тиире как кому нравится, там же ползунок в (прямоугольник с закругленными углами) и к нему еще эффект тени, дальше в форм маус даун и форм маус мув передаем все в он тач, в котором обрабатываем движения мыши, обращаясь к компонентам по типу и чаилдом, это позволяет делать хоть 10 таких трек баров и управлять можно каждым из них отдельным пальцем, позже выложу код этих процедур

P.S. а вот и код
Код:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
var
  t: TTouches;
begin
  if ssLeft in Shift then
  begin
    SetLength(t, 1);
    t[0].Location := PointF(X, Y);
    FormTouch(nil, t, TTouchAction.Down);
  end;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Single);
var
  t: TTouches;
begin
  if ssLeft in Shift then
  begin
    SetLength(t, 1);
    t[0].Location := PointF(X, Y);
    FormTouch(nil, t, TTouchAction.Move);
  end;
end;

procedure TForm1.FormTouch(Sender: TObject; const Touches: TTouches;
  const Action: TTouchAction);
var
  t: TTouch;
  f: TFmxObject;
  m: trectf;
  l: TLine;
  r: TRoundRect;
  p: tpointf;
  i, i1: Integer;
begin
  for t in Touches do
  begin
    case Action of
      // TTouchAction.None: ;
      TTouchAction.Up:
        begin
          if not CheckBox2.IsChecked then
          begin
            for f in children do
              if f is TLayout then
              begin
                m := TLayout(f).AbsoluteRect;
                m.Inflate(0, -10);
                if m.Contains(t.Location) then
                begin
                  l := TLine(TLayout(f).children[0]);
                  r := TRoundRect(l.children[0]);
                  p := TLayout(f).AbsoluteToLocal(t.Location);
                  if r.Name = 'RoundRect1' then
                  begin
                    p.X := r.Position.X;
                    p.Y := 80;
                  end;
                  if r.Name = 'RoundRect2' then
                  begin
                    p.X := 80;
                    p.Y := r.Position.Y;
                  end;
                  r.Position.Point := p;
                  if r.Name = 'RoundRect1' then
                  begin
                    i := strtoint(format('%3.0f', [p.Y]));
                    i1 := map(i, -5, 165, 100, -100);
                  end;
                  if r.Name = 'RoundRect2' then
                  begin
                    i := strtoint(format('%3.0f', [p.X]));
                    i1 := map(i, -15, 175, 100, -100);
                  end;
                  TText(l.children[1]).Text := inttostr(i1) + '%';
                  SendData;
                end;
              end;
          end;
       end;
      TTouchAction.Down, TTouchAction.Move:
        for f in children do
          if f is TLayout then
          begin
            m := TLayout(f).AbsoluteRect;
            m.Inflate(0, -10);
            if m.Contains(t.Location) then
            begin
              l := TLine(TLayout(f).children[0]);
              r := TRoundRect(l.children[0]);
              p := TLayout(f).AbsoluteToLocal(t.Location);
              if r.Name = 'RoundRect1' then
              begin
                p.X := r.Position.X;
                p.Y := p.Y - 5 - r.Height * 0.5;
              end;
              if r.Name = 'RoundRect2' then
              begin
                p.Y := r.Position.Y;
                p.X := p.X - 5 - r.Width * 0.5;
              end;
              r.Position.Point := p;
              if r.Name = 'RoundRect1' then
              begin
                i := strtoint(format('%3.0f', [p.Y]));
                i1 := map(i, -5, 165, 100, -100);
              end;
              if r.Name = 'RoundRect2' then
              begin
                i := strtoint(format('%3.0f', [p.X]));
                i1 := map(i, -15, 175, 100, -100);
              end;
              TText(l.children[1]).Text := inttostr(i1) + '%';
              SendData;
            end;
          end;
      // TTouchAction.Cancel: ;
    end;
  end;
end;

Последний раз редактировалось PTyTb32; 15.09.2017 в 14:00.
PTyTb32 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi XE7 Multi Device Application SASFM Компоненты Delphi 1 28.04.2016 22:47
Delphi Android Multi-touch GGaDz Общие вопросы Delphi 0 28.11.2013 10:49
ExtJS4 multi upload smoke92 JavaScript, Ajax 0 02.05.2012 11:07
Multi Desktop (Windows) Jenya Win Api 6 24.06.2008 16:10