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

  1. #1
    Membre à l'essai
    OnTouchEvent sur un canvas et OnTouch sur des textView ne fonctionnent pas ensemble
    Bonjour,
    mon problème doit être connu mais je ne trouve rien sur le net.
    J'affiche un textView et quand on clique dessus avec le doigt, d'autres texViews apparaissent (animation)
    J'utilise pour ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    onTouch(View view, MotionEvent motionEvent)
    En même temps j'aimerai que l'utilisateur puisse dessiner avec le doigt (qu'on puisse voir la trace du doigt, je teste en traçant ici des segments)
    Pour ce faire, j'utilise un canvas dans une vue personnalisées et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    onTouchEvent(MotionEvent event)
    Mais je n'arrive pas à avoir les deux ensemble :1) l'utilisateur dessine et 2) le déclenchement de l'animation quand le doigt passe sur le textView.

    D'après mes recherches onTouchEvent est executée avant onTouch : on touche l'écran avant de toucher le textView.

    Donc j'ai envie que onTouchEvent renvoie FALSE pour que le toucher ne soit pas consommé et que onTouch le voit. Ça fonctionne saut qu'alors onTouchEvent ne fonctionne plus et on ne peut plus dessiner.
    Pour être précis ACTION_DOWN est réalisé mais ACTION_MOVE et ACTION_UP non car avec FALSE, pour onTouch, le doigt n'est plus sur l'écran.

    J'ai lu qu'on pouvait utiliser performClick() mais je n'ai pas compris comment.
    Je vous remercie pour votre attention.
    Voici le code des 3 fichiers :

    MainActivity.java
    Code Java :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
    public class MainActivity extends AppCompatActivity {
     
        int hauteurEcran,largeurEcran;  // En pixels
        int rayon,xcentre,ycentre,nombreLettres,tailleLettres;
        TextView tv,lettres[] = new TextView[10];
        TranslateAnimation animation[] = new TranslateAnimation[10];
        ConstraintLayout constraintLayout;
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
     
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
     
            Display display = getWindowManager().getDefaultDisplay();
            Point size = new Point();
            display.getSize(size);
            hauteurEcran = size.y;
            largeurEcran = size.x;
            tailleLettres = largeurEcran/10;
            rayon = (int)(hauteurEcran/4*0.8);
            xcentre = (int)(largeurEcran*0.5-tailleLettres/2);
            ycentre = (int)(hauteurEcran*0.75-tailleLettres);
            tv = findViewById(R.id.tv);
            tv.setX(xcentre);
            tv.setY(ycentre);
            tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 40);
            nombreLettres =7;
            constraintLayout = findViewById(R.id.cl);
            for(int i=0;i<nombreLettres;i++){
                lettres[i] = new TextView(this);
                constraintLayout.addView(lettres[i]);
                lettres[i].setVisibility(View.GONE);
                lettres[i].setText(String.valueOf(i));
                lettres[i].setBackgroundResource(R.drawable.rouge);
                lettres[i].getLayoutParams().width = tailleLettres;
                lettres[i].getLayoutParams().height = tailleLettres;
                lettres[i].setGravity(Gravity.CENTER | Gravity.CENTER);
                lettres[i].setTypeface(null, Typeface.BOLD);
                lettres[i].setTextSize(TypedValue.COMPLEX_UNIT_SP, 40);
                lettres[i].setId(i);
                lettres[i].setOnTouchListener(touchListener);
            }
            tv.setOnTouchListener(touchListener);
        }
        private View.OnTouchListener touchListener = new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                if (view == tv){
                        for(int i=0;i<nombreLettres;i++){
                            lettres[i].setX((float)(xcentre));
                            lettres[i].setY((float)(ycentre));
                            animation[i] = new TranslateAnimation(0,(float)(rayon*Math.cos(2*Math.PI*i/nombreLettres)),0,(float)(-rayon*Math.sin(2*Math.PI*i/nombreLettres)));
                            lettres[i].setVisibility(View.VISIBLE);
                            animation[i].setDuration(2000);
                            animation[i].setFillAfter(true);
                            animation[i].setFillEnabled(true);
                            lettres[i].startAnimation(animation[i]);
                        }
                }
                return true;
            }
        };
    }


    activity_main.xml
    Code XML :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
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/cl"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity"
        android:background="@drawable/app_background">
        <TextView
            android:id="@+id/tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!"  />
       <fr.padrixe.devinelesmots.DrawingView
            android:id="@+id/myDrawingView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"  />
    </androidx.constraintlayout.widget.ConstraintLayout>


    DrawingView.java
    Code Java :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
    public class DrawingView extends View {
        Paint myPaint;
        int debutX=0;
        int debutY=0;
        int finX=0;
        int finY=0;
        Context c;
        public DrawingView(Context context, AttributeSet attributeSet) {
            super(context,attributeSet);
            myPaint = new Paint();
            myPaint.setAntiAlias(true);
            myPaint.setDither(true);
            myPaint.setColor(Color.RED);
            myPaint.setStyle(Paint.Style.FILL_AND_STROKE);
            myPaint.setStrokeJoin(Paint.Join.ROUND);
            myPaint.setStrokeCap(Paint.Cap.ROUND);
            myPaint.setStrokeWidth(20);
            c=context;
        }
        @Override
        protected void onDraw(Canvas canvas) {
            canvas.drawLine(debutX, debutY, finX, finY, myPaint); // pour tester
            invalidate();
        }
       @Override
        public boolean onTouchEvent(MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    Toast.makeText(c.getApplicationContext(),"ACTION_DOWN",Toast.LENGTH_SHORT).show(); // seul toast visible avec false
                    debutX = (int) event.getX();
                    debutY = (int) event.getY();
                    finX = (int) event.getX();
                    finY = (int) event.getY();
                    invalidate();
                    break;
                case MotionEvent.ACTION_MOVE:
                    Toast.makeText(c.getApplicationContext(),"ACTION_MOVE",Toast.LENGTH_SHORT).show();
                    finX = (int) event.getX();
                    finY = (int) event.getY();
                    invalidate();
                    break;
                case MotionEvent.ACTION_UP:
                    Toast.makeText(c.getApplicationContext(),"ACTION_UP",Toast.LENGTH_SHORT).show();
                    invalidate();
                    break;
            }
            return false;
        }
    }

  2. #2
    Modérateur

    Pourquoi faire un onTouch plutôt qu'un onClick sur le Textview ?
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre à l'essai
    Ce que je souhaite faire, c'est un peu comme les jeux de lettres où tu passes le doigts sur les lettres dans un certain ordre pour former un mot. En même temps le chemin du doigt apparaît.
    Tu penses que ça fonctionnera avec onClick ? Parce que si je touche une lettre et que je glisse sur une autre, onClick n'en tient pas compte non ?

  4. #4
    Membre à l'essai
    Hello,
    je pense avoir réussi. Je l'indique ici car ça peut servir à d'autres.
    J'ai basculer les deux listeners dans la classe principale et avec des variables public static, j'arrive à les utiliser dans l'autre classe.

    A bientôt !

###raw>template_hook.ano_emploi###