Bonjour,

Voilà mon problème :

J'ai un bouton qui une fois qu'on a cliqué dessus se met a tourner sur lui même grâce a un ValueAnimator. Mon problème est que je souhaite qu'au moment ou l'utilisateur lâche le bouton, je puisse lancer une animation de translation dans la bonne direction (je n'arrive pas à être plus clair voyez un lancé de poids comme métaphore). Donc je me suis dit que j'aurais besoin de deux points qui tournerons en même temps que le bouton pour pouvoir par la suite calculer la droite sur laquelle mon bouton vas devoir translater. J'ai donc créer une classe InvisibleDirectionnalBar qui contient deux points censés pouvoir tourner. Pour pouvoir afficher une ligne en vu de tester le bon fonctionnement de la classe je la faite dériver d'une View. Maintenant je veux simplement réimplémenter le setRotation() pour que lorsque cette méthode est appelée ce soit ma ligne qui tourne (et pas la totalité de la View). J'ai donc fait plusieurs essai avec les Matrices entre autre et aussi avec la triggo ... Je suis EXTRÊMEMENT mauvais en mathématiques, je n'ai donc pas réussi à trouver une formule qui marche. Quand aux Matrices, ce code me rends un résultat bizarre :

Dans cet exemple j'ai remplacé les points par un rectangle de 40*90 (pour mieux observer le résultat) :

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
 
    @Override
    public void setRotation(float rotation) {
        //super.setRotation(rotation);
        Matrix m = new Matrix();
        m.setRotation(rotation, rect.centerX(), rect.centerY());
        m.mapRect(r);
    }
 
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint p = new Paint();
        p.setColor(Color.BLACK);
 
        canvas.drawRect(r, p);
    }
Le rectangle ne tourne pas mais il grossi de plus en plus jusqu'à disparaître complètement.

Je serais reconnaissant a une âme charitable de m'aider dans mon dur labeur :p

Merci d'avance

EDIT: Après Un jour et demi de recherche, j'ai trouvé un algorithme qui pourrait faire l'affaire mais la ligne ne cesse de rétrécir jusqu'à disparaître --'. quelqu'un peut il me dire ce que je fais mal ? :

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
private void rotateLine(float rotation) {
 
        double radians = (Math.PI / 180.0) * rotation;
        double sinA = Math.sin(radians);
        double cosA = Math.cos(radians);
 
        Point points[] = {headPoint, footPoint};
 
        int cX = points[0].x + ((points[1].x - points[0].x) / 2);
        int cY = points[0].y + ((points[1].y - points[0].y) / 2);
 
        for(Point p : points) {
            int x = p.x - cX;
            int y = p.y - cY;
            double h = Math.hypot(x,y);
 
            double cosB = 0.0;
            double sinB = 0.0;
 
            if(h != 0.0)
            {
                cosB = x / h;
                sinB = y / h;
            }
 
            p.set(cX + (int)(((cosA * cosB) - (sinA * sinB)) * h),
                  cY + (int)(((sinA * cosB) + (cosA * sinB)) * h));
        }
    }