Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Problème avec TInnerGlowEffect


Sujet :

Langage Delphi

  1. #1
    Candidat au Club
    Problème avec TInnerGlowEffect
    Salut a tous, je suis maintenant bloqué sur ce problème depuis une bonne semaine… Voici une vidéo de mon problème plutôt que d'essayer de l'expliquer vaguement.
    lien:
    explication: Quand je clique sur un TSpeedBtn, il doit se mettre en bleu(pour montrer ou l'utilisateur a cliqué)
    Ensuite grâce aux tag que j'ai mis sur chaque TSpeedBtn je peut les identifier. Et mettre un nouveau TInnerGlowEffect.

    quand j'utilise qu'une seul des deux procédure, ca marche parfaitement. Mais quand j'utilise les deux ensembles, les couleurs se mélange.
    J'utilise le Framework firemonkey.

    n'hésiter surtout pas a faire des commentaires sur mon code. Ou de demander plus d'explication.
    un grand merci pour votre temps

    le code si besoin:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    var
      GlowGame: TGameGlow;
    begin
      GlowGame:=TGameGlow.Create(Sender); // appelle le constructor
      try
        GlowGame.DisplayPos(Sender); //appelle la procedure qui fait un glow sur le TSpeedBtn cliqué
        GlowGame.DisplayOtherPos(Sender);// appelle la procedure qui fait un glow sur le TSpeedBtn en haut
      finally
        GlowGame.Free;
      end;
    end;


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    constructor TGameGlow.Create(Sender: Tobject);
    begin
      if GlowPos=nil then
        GlowPos:=TInnerGlowEffect.Create(nil);
      if GlowUp=nil then
        GlowUp:=TInnerGlowEffect.Create(nil);
    end;


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TGameGlow.DisplayPos(Sender: Tobject);
    begin
      with GlowPos do
      begin
        Softness:=1;
        Opacity:=1;
        Enabled:=True;
        GlowColor:=TAlphaColors.Blue;
        Parent:=TSpeedButton(sender);
      end;
    end;

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    procedure TGameGlow.DisplayOtherPos(Sender: TObject);
    var
      I: Integer;
      Start, Up: Byte;
    begin
      Start:=TSpeedButton(Sender).Tag;
      Up:=Start-7;
     
      for I := 0 to Form1.GamePageFrame11.ComponentCount-1 do // loop pour les composants de ma Frame
      begin
        if Form1.GamePageFrame11.Components[I] is TSpeedButton then // si le composant est un TSpeedBtn
        begin
          if TSpeedButton(Form1.GamePageFrame11.Components[I]).Tag=Up then // si son tag = au up(calcule en haut)
          begin
            with GlowUp do     
            begin
              Softness:=1;
              Opacity:=1;
              Enabled:=True;
              GlowColor:=TAlphaColors.Red;
              Parent:=TSpeedButton(Form1.GamePageFrame11.Components[I]);
            end;
          end;
        end;
      end;
    end;

  2. #2
    Expert éminent sénior
    ton code est assez horrible je dois dire...

    pourquoi créer un GameGlow pour le détruire juste après ? tu as fais ta formation sur Java ?

    et qu'est ce qui fait disparaître l'effet ? le Timer ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Candidat au Club
    j'ai décidé de mettre tout mon code en rapport avec glow dans une fiche unité pour ne pas polluer le fichier principal. En Delphi pour accéder a une fiche il faut la créer pour pouvoir accéder aux méthodes, puis je la libère. Ce qui me pose problème c'est que les couleurs se mélangent. Dans mon constructor, je regarde si ma variable globale est nulle. si oui je la créer. Ensuite j'appelle mes deux procédure, et c'est la que ca coince.
    Les effets ne disparaissent jamais enfaite. ce qui change c'est la parent du glow(ce qui ne pose aucun soucis).
    Je n'ai aucune expérience en java aussi.

  4. #4
    Rédacteur/Modérateur

    Bonjour,
    Citation Envoyé par Tartie Voir le message
    j'ai décidé de mettre tout mon code en rapport avec glow dans une fiche unité pour ne pas polluer le fichier principal. En Delphi pour accéder a une fiche il faut la créer pour pouvoir accéder aux méthodes, puis je la libère.
    AMHA fortement discutable.

    Avez-vous essayé sans passer par ce truc alambiqué, un code simple, quelques boutons et une gestion de ces effets dans le code ?

    [Edit] Je n'aurais certainement pas fait de la même manière (en utilisant des effets) mais j'ai voulu en avoir le cœur net et surtout comprendre le " les couleurs se mélangent".
    Aussi ai-je concocté un petit programme d'essai. Sans parler de voir le "mélange" j'ai effectivement vu qu'affecter un effet a un objet ayant déjà un effet ça ne fonctionnait pas.

    pour résoudre le problème j'ai simplement joué sur la propriété Enabled

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    // Liste des TSpeedButtons pour connaitre le "voisinage droite"
    asb:=TList<TSpeedButton>.Create();
    aSB.Add(sb1);
    aSB.Add(sb2);
    aSB.Add(sb3);
    aSB.Add(sb4);
    aSB.Add(sb5);
    end;
     
    procedure TForm1.sb1Click(Sender: TObject);
    begin
    if GlowRed.Parent=TSpeedButton(Sender) then  GlowRed.Enabled:=False;
    Glowblue.Parent:=TSpeedButton(Sender);
    try
      GlowRed.Parent:=asb[TSpeedButton(Sender).tag];
      GlowRed.Enabled:=True;
    except
      GlowRed.Parent:=Self;  // utile ?
    end;
    end;
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  5. #5
    Candidat au Club
    j'ai viens de déplacer le code de mon unité dans ma procédure de mon speedbtn et toujours le même problème de couleur. Maintenant un nouveau problème, quand je déclare mes deux variable Glow et GlowUp localement j'ai un warning ' La variable 'GlowUp' et 'GlowUp' n'a pas été initialisée '. Mais quand je les déclares globalement aucun soucis(a part les couleurs qui se mélangent, exactement comme avant). Alors du coup comment faire pour utiliser mes variable localement? Cela pourrait surement résoudre le problème.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    var
      I: Integer;
      Start, Up: Byte;
      GlowPos,GlowUp: TInnerGlowEffect;
    begin
      if GlowPos=nil then
        GlowPos:=TInnerGlowEffect.Create(nil);
      if GlowUp=nil then
        GlowUp:=TInnerGlowEffect.Create(nil);
     
      with GlowPos do
      begin
        Softness:=1;
        Opacity:=1;
        Enabled:=True;
        GlowColor:=TAlphaColors.Blue;
        Parent:=TSpeedButton(sender);
      end;
     
      Start:=TSpeedButton(Sender).Tag;
      Up:=Start-7;
     
      for I := 0 to Form1.GamePageFrame11.ComponentCount-1 do
      begin
        if Form1.GamePageFrame11.Components[I] is TSpeedButton then
        begin
          if TSpeedButton(Form1.GamePageFrame11.Components[I]).Tag=Up then
          begin
            with GlowUp do
            begin
              Softness:=1;
              Opacity:=1;
              Enabled:=True;
              GlowColor:=TAlphaColors.Red;
              Parent:=TSpeedButton(Form1.GamePageFrame11.Components[I]);
            end;
          end;
        end;
      end;
     
    //  StartGame(Sender);
    end;

  6. #6
    Expert éminent sénior
    bon alors, j'ai regardé de plus près, il y a un bug dans FMX

    voici un code plus simple (à mes yeux) pour produire ton exemple et qui utilise deux méthodes

    si on défini {$DEFINE MOVE_GLOW} deux TInnerGlowEffect sont utilisés et on change leur parent quand on clique
    si on désactive ce $DEFINE, chaque SpeedButton possède son propre GlowEffect dont la couleur change et qui peut être actif ou non.

    quelques explications

    Buttons[] est un tableau de 7x7 dont les coins sont vides, il permet de retrouver le bouton "au dessus" de [x, y] avec [x, y - 1]...j'aurais même pu faire un tableau de [7x8] avec une ligne vide en haut afin de ne pas tester sur y > 0.

    TMySpeedButton est un SpeedButton dans lequel j'ajoute des propriétés qui m'arrangent, ici x et y, et le Glow effect quand c'est nécessaire.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
     
    unit Unit1;
     
    interface
     
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
      FMX.Controls.Presentation, FMX.StdCtrls, FMX.Effects, FMX.Memo.Types,
      FMX.ScrollBox, FMX.Memo;
     
    {.$DEFINE MOVE_GLOW} // présente un bug
     
    type
      TMySpeedButton = class(TSpeedButton)
      private
        x, y: Integer;
      {$IFNDEF MOVE_GLOW}
        Glow: TInnerGlowEffect;
      {$ENDIF}
      end;
     
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
        Buttons: array[0..6, 0..6] of TMySpeedButton;
      {$IFDEF MOVE_GLOW}
        Glow1: TInnerGlowEffect;
        Glow2: TInnerGlowEffect;
      {$ELSE}
        Button1: TMySpeedButton;
        Button2: TMySpeedButton;
      {$ENDIF}
        procedure CreateButton(x, y: Integer);
        procedure ButtonClick(Sender: TObject);
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.fmx}
     
    procedure TForm1.ButtonClick(Sender: TObject);
    var
      Button: TMySpeedButton;
    begin
      Button := TMySpeedButton(Sender);
     
    {$IFDEF MOVE_GLOW}
      Glow1.Parent := Button;
      Glow1.Enabled := True;
    {$ELSE}
      if Button1 <> nil then
        Button1.Glow.Enabled := False;
     
      if Button2 <> nil then
        Button2.Glow.Enabled := False;
     
      Button1 := Button;
      Button1.Glow.GlowColor := TAlphaColorRec.Blue;
      Button1.Glow.Enabled := True;
    {$ENDIF}
     
      if (Button.y = 0) then
        Button := nil
      else
        Button := Buttons[Button.x, Button.y - 1];
     
    {$IFDEF MOVE_GLOW}
      if Button = nil then
      begin
        Glow2.Enabled := False;
      end else begin
        Glow2.Parent := Button;
        Glow2.Enabled := True;
      end;
    {$ELSE}
      Button2 := Button;
      if Button2 <> nil then
      begin
        Button2.Glow.GlowColor := TAlphaColorRec.Red;
        Button2.Glow.Enabled := True;
      end;
    {$ENDIF}
     
    end;
     
    procedure TForm1.CreateButton(x, y: Integer);
    const
      SIZE = 60;
    var
      Button: TMySpeedButton;
    begin
      Button := TMySpeedButton.Create(Self);
      Button.SetBounds(10 + x * SIZE, 10 + y * SIZE, SIZE, SIZE);
      Button.Text := '(' + IntToStr(x) + ',' + IntToStr(y) + ')';
      Button.Parent := Self;
      Button.x := x;
      Button.y := y;
      Button.OnClick := ButtonClick;
    {$IFNDEF MOVE_GLOW}
      Button.Glow := TInnerGlowEffect.Create(Button);
      Button.Glow.Softness := 1;
      Button.Glow.Opacity := 1;
      Button.Glow.Enabled := False;
      Button.Glow.Parent := Button;
    {$ENDIF}
      Buttons[x, y] := Button;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      x, y: Integer;
    begin
      for y := 0 to 6 do
      begin
        for x := 2 to 4 do
        begin
          CreateButton(x, y);
        end;
      end;
      for y := 2 to 4 do
      begin
        for x := 0 to 1 do
        begin
          CreateButton(x, y);
          CreateButton(x + 5, y);
        end;
      end;
    {$IFDEF MOVE_GLOW}
      Glow1 := TInnerGlowEffect.Create(Self);
      Glow1.Softness := 1;
      Glow1.Opacity := 1;
      Glow1.GlowColor := TAlphaColorRec.Blue;
     
      Glow2 := TInnerGlowEffect.Create(Self);
      Glow2.Softness := 1;
      Glow2.Opacity := 1;
      Glow2.GlowColor := TAlphaColorRec.Red;
    {$ENDIF}
    end;
     
    end.


    en fait quand on clique sur une première case, tout va bien, mais si on clique sur la case juste en dessous, le bouton qui devrait devenir rouge reste bleu...je soupçonne une mise en cache de l'effet ou un truc du genre...
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Candidat au Club
    merci beaucoup Paul pour ton aide ca ma vraiment bien aidé!! j'ai oublié de préciser que je suis débutant, et ton exemple a répondu a pas mal d'autre questions que j'avais dans le coin de la tête.
    merci SergioMaster, je viens d'essayer avec ton exemple et ca marche super bien!!!! Je ne connaissais pas l'astuce du ' TList '.



    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    asb:=TList<TSpeedButton>.Create();

    Merci !!!!!

  8. #8
    Expert éminent sénior
    je viens de faire un test qui semble corriger le problème

    il suffit de désactiver les GlowEffect AVANT d'en changer le parent

    en ligne 54

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    {$IFDEF MOVE_GLOW}
      Glow1.Enabled := False;
      Glow2.Enabled := False;
     
      Glow1.Parent := Button;  
      Glow1.Enabled := True;
    {$ELSE}
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Candidat au Club
    un énorme merci pour votre aide apporté et pour les réponses rapides !!!

  10. #10
    Rédacteur/Modérateur

    Bonjour,

    je me demande si ce qui est recherché n'est pas quelque chose comme ça

    confectionné à base de style et d'une StringList (au départ un Array[0..9][0..9] beaucoup moins lisible et dans la perspective d'autres style de casse-tête )
    pourquoi 10 colonnes et non 9 (le maximum) ? Parce que j'utilise un GridPanelLayout pour placer mes "Billes", je ne me suis pas cassé la tête mais bien amusé

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    procedure TForm116.Button2Click(Sender: TObject);
    var c,l : integer;
        Cs : String;
     
        function AddBille(valeur : Char) : TButton;
        begin
           Result := TButton.Create(self);
           Result.Align:=TAlignLayout.Client;
           try
            Result.Visible:=Valeur in ['x','o'];
            if valeur='x' then Result.StyleLookup:='unecase'
                         else Result.StyleLookup:='unecasevide';
           except
             Result.Visible:=False;
           end;
        end;
     
    begin
      for c := 0 to 9 do
       begin
        try
         cs:=G[c];
         for l := 0 to 9 do
         begin
           Grille.AddObject(AddBille(cs[l]));
         end;
        except
          for l := 0 to 9 do AddBille(' ');
        end;
       end;
    end;
     
    procedure TForm116.FormCreate(Sender: TObject);
    begin
    // Casse Tête "tablier anglais" le plus connu
    G:=TStringList.Create;
    G.Add('  xxx  ');
    G.Add('  xxx  ');
    G.Add('xxxxxxx');
    G.Add('xxxoxxx');
    G.Add('xxxxxxx');
    G.Add('  xxx  ');
    G.Add('  xxx  ');
    end;
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  11. #11
    Candidat au Club
    c'est exactement ce style de programme que j'essaye de faire. j'y ai mis un glow effet sur le speedbtn cliqué, et sur ceux à coté. Mais grâce a vous mon problème a été résolue!!!!
    Juste une petite question a propos de ton code. Quelle sont les avantages d'avoir mis ta function en dessous des variables?

  12. #12
    Rédacteur/Modérateur

    Citation Envoyé par Tartie Voir le message

    Juste une petite question a propos de ton code. Quelle sont les avantages d'avoir mis ta function en dessous des variables?
    C'est une fonction à portée "réduite" à la seule procedure parente.

    J'ai tenté d'améliorer en proposant plusieurs tabliers différents et en construisant le gidpanellayout en fonction de ceux-ci


    je crois que je viens de tomber sur un , si quelqu'un veux bien vérifier ma logique (procedure remplirgrille)

    comme vous le voyez la colonne de droite n'apparait pas alors qu'elle est bien crée et à la bonne taille
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  13. #13
    Membre éprouvé
    Bonjour,

    une petite inversion peut être
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      for c := 0 to g.Count-1 do              // <--------------------- ICI ----------------
       begin
        try
         cs:=G[c];
         for l := 1 to gc do                      // <--------------------- ICI ----------------
         begin
           Grille.AddObject(AddBille(cs[l]));
         end;
        except
          for l := 0 to 9 do AddBille(' ');
        end;
       end;


    Cordialement,

    @+

  14. #14
    Rédacteur/Modérateur

    Merci
    Citation Envoyé par Cirec Voir le message

    une petite inversion peut être
    J'y avais songé mais uniquement pour la création ligne/colonne, colonne/ligne, pas pour le remplissage.
    C'est vrai qu'il y a un problème d'inversion ligne colonne, caché par le fait que ce soit symétrique mais le problème venait de mon "analyse de chaine"
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    procedure TForm116.RemplirGrille(Span : Word = 1) ;
    var c,l : integer;
        Cs : String;
        gc : integer;
        ci : TGridPanelLayout.TColumnItem;
        ri : TGridPanelLayout.TRowItem;
     
        function AddBille(valeur : Char) : TButton;
        begin
           Result := TButton.Create(self);
           Result.Align:=TAlignLayout.Client;
           Result.Parent:=Grille;
           try
            Result.Visible:= Charinset(Valeur,['x','o']);
            if valeur='x' then Result.StyleLookup:='unecase'
                         else Result.StyleLookup:='unecasevide';
           except
             Result.Visible:=False;
           end;
        end;
     
    begin
      gc:=-1;
      memo1.Lines.Clear;
      for l:=0 to g.Count-1 do
        begin
          if Length(g[l])> gc then gc:=Length(g[l]);
        end;
      Grille.BeginUpdate;
      Grille.ControlCollection.Clear;
      Grille.RowCollection.Clear;
      for l := 1 to g.Count*span do
         ri:=Grille.RowCollection.Add;
      Grille.ColumnCollection.Clear;
      for c := 1 to gc*span do
         ci:=Grille.ColumnCollection.Add;
      for l := 0 to g.count-1 do
       begin
        cs:=G[l];
        try
         for c := 0 to gc-1 do
         begin
           AddBille(cs[c+1]);
    //       if Span>1 then
    //        begin
    //          Grille.ControlCollection.ControlItems[c,l].ColumnSpan:=Span;
    //          Grille.ControlCollection.ControlItems[c,l].RowSpan:=Span;
    //        end;
         end;
        except
     
        end;
       end;
      Grille.EndUpdate;
    end;


    Il n'y a plus que la formation triangulaire qui me pose souci, ce j'ai prévu de régler avec les ColumnSpan et RowSpan pour l'instant encore en commentaire
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd