IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

JavaScript Discussion :

Tracer librement sur Canvas (tactile)


Sujet :

JavaScript

  1. #1
    Membre régulier
    Femme Profil pro
    artisan
    Inscrit en
    Février 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : artisan

    Informations forums :
    Inscription : Février 2020
    Messages : 8
    Par défaut Tracer librement sur Canvas (tactile)
    Bonjour à tous,

    Grande débutante en html5/javascript je me suis lancée sur le projet suivant : avoir un Canvas sur une page html, sur lequel l'utilisateur peut créer un cercle de couleur noire sur double clic, et tracer librement des formes à la souris en restant cliqué.

    En bidouillant tant bien que mal et d'après un modèle trouvé sur le net (je n'ai plus la référence originale, désolée...), j'arrive à un code qui n'est probablement pas optimisé mais qui fonctionne très bien à la souris.

    Le code javascript
    Code JAVASCRIPT : 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
    <script type="text/javascript">
     
        var canvas, ctx, flag = false,
            prevX = 0,
            currX = 0,
            prevY = 0,
            currY = 0,
            dot_flag = false;
     
        var x = "black";
     
        function init() {
            canvas = document.getElementById('can');
            ctx = canvas.getContext("2d");
            w = canvas.width;
            h = canvas.height;
            var fond = new Image();
            fond.src = "/storage/emulated/0/Download/image.png";
    		fond.onload = function(){
            ctx.drawImage(fond,0,0);  
            }
     
            canvas.addEventListener("dblclick", cercle, false);
            canvas.addEventListener("mousemove", function (e) {
                findxy('move', e)
            }, false);
            canvas.addEventListener("mousedown", function (e) {
                findxy('down', e)
            }, false);
            canvas.addEventListener("mouseup", function (e) {
                findxy('up', e)
            }, false);
     
        }
     
        function cercle(e) {
    	ctx.strokeStyle = 'black';
            ctx.beginPath();
     	ctx.lineWidth = 4;
            ctx.arc(currX, currY, 20, 0, 2 * Math.PI); 
            ctx.stroke();
            ctx.closePath();
        }
     
        function draw() {
            ctx.beginPath();
            ctx.moveTo(prevX, prevY);
            ctx.lineTo(currX, currY);
            ctx.strokeStyle = x;
            ctx.lineWidth = 4;
            ctx.stroke();
            ctx.closePath();
        }
     
        function findxy(res, e) {
            if (res == 'down') {
                prevX = currX;
                prevY = currY;
                currX = e.clientX - canvas.offsetLeft;
                currY = e.clientY - canvas.offsetTop;
     
                flag = true;
                dot_flag = true;
                if (dot_flag) {
                    ctx.beginPath();
                    ctx.fillStyle = x;
                    ctx.fillRect(currX, currY, 2, 2);
                    ctx.closePath();
                    dot_flag = false;
                }
            }
     
            if (res == 'up') {
                flag = false;
            }
            if (res == 'move') {
                if (flag) {
                    prevX = currX;
                    prevY = currY;
                    currX = e.clientX - canvas.offsetLeft;
                    currY = e.clientY - canvas.offsetTop;
                    draw();
                }
            }
        }
     
        </script>

    Le canvas
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <canvas id="can" width="455" height="741" style="position:absolute;top:3%;left:35%;border:2px solid;"></canvas>


    Si tout fonctionne bien, alors pourquoi fais-je appel à vous ?
    Tout simplement car je veux ouvrir mon fichier sur Chrome sur une tablette android, et là c'est le drame.

    -Le double clic fonctionne bien pour tracer un cercle
    -L'image et mon css se chargent bien en local
    -Le traçage au doigt ne fonctionne pas du tout !!


    Quelques infos complémentaires :
    -J'ai ajouté touchstart, touchmove et touchend dans mes addEventListener sans aucune amélioration.
    -Au départ le double tap pour tracer un cercle ne fonctionnait pas, Chrome android faisait un zoom sur la page à la place. J'ai donc du désactiver cette fonctionnalité en ajoutant la ligne : <meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0' >.
    -J'ai l'impression que Chrome android prend le déplacement du doigt comme un défilement de la page internet (voire d'une actualisation de la page si on est tout en haut), j'ai donc essayé de bloquer le défilement de page en CSS. Cela n'a rien résolu.
    Code css : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    html, body {
    	margin: 0; 
    	height: 100%; 
    	overflow: hidden
    }
    -J'ai vu des mentions de e.touches[0].clientX qui remplacerait e.clientX dans la version tactile; j'ai tenté mais sans succès.

    J'arrive au bout de mes compétences alors que tout cela est si proche de fonctionner mais il doit me manquer un détail quelque part !!
    Merci de m'avoir lue et encore un autre merci à ceux qui s'intéresseront à mon problème

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 198
    Par défaut
    Bonjour,
    regarde du côté de event.preventDefault.

  3. #3
    Membre régulier
    Femme Profil pro
    artisan
    Inscrit en
    Février 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : artisan

    Informations forums :
    Inscription : Février 2020
    Messages : 8
    Par défaut
    Merci je vais voir et enquêter de ce côté là. Je vous tiens au courant.

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/03/2008, 18h38
  2. [Tkinter] Insérer une image jpg sur un canvas avec PIL
    Par Kyojimbo dans le forum Tkinter
    Réponses: 2
    Dernier message: 23/02/2006, 16h46
  3. Ecriture verticale sur un canvas
    Par blaiseac dans le forum Langage
    Réponses: 3
    Dernier message: 01/08/2005, 21h59
  4. Ombres portées sur un canvas
    Par pifou02 dans le forum Langage
    Réponses: 2
    Dernier message: 23/11/2003, 19h03
  5. Comment mettre le curseur d'un Memo sur le Canvas d'une Form ?
    Par julie20 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 27/08/2003, 13h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo