16 votes

Comment obtenir la toile actuelle ?

J'ai un DrawView. Si je touche cette vue, elle dessine de petits cercles. Je veux dessiner des cercles mais pas toucher la vue - avec l'aide de la fonction "setPoints". Ce que je fais :

package com.samples;
import ...

public class DrawView extends View {
    ArrayList<Point> points = new ArrayList<Point>();

    Paint paint = new Paint();

    private int pSize = 5;
    private int pColor = Color.BLACK;

    public DrawView(Context context, AttributeSet attrs) {

        super(context, attrs);

        setFocusable(true);
        setFocusableInTouchMode(true);

        this.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                v.setOnTouchListener(this);
                    Point point = new Point();
                    point.x = event.getX();
                    point.y = event.getY();
                    points.add(point); 
                    invalidate();
                }
                return true;
            }
        });
        requestFocus();
    }

    @Override
    public void onDraw(Canvas canvas) { 
        for (Point point : points) {
            canvas.drawCircle(point.x, point.y, pSize, paint);
        }
    }

    public void setPoints(Float xP, Float yP)
    {
        Point point = new Point();
        point.x = xP;
        point.y = yP;
        points.add(point);
        postInvalidate();
    }
}

class Point {
    float x, y;

    @Override
    public String toString() {
        return x + ", " + y;
    }
}

Dites-moi, s'il vous plaît, comment faire pour canaliser la fonction setPoints ?

Mise à jour : Wow, c'est vraiment un problème intéressant. Mon DrawView contient un HorizontalScrollView. Parce que si je fixe les bonnes coordonnées dans ce DrawView, personne ne sait où sont les cercles à dessiner.

9voto

Raffaele Points 10209

Tu ne peux pas. Le canevas est géré par le système et est passé à votre onDraw() . Je ne comprends pas pourquoi vous en auriez besoin en dehors de là. Redéclarez simplement setPoints comme ceci

public void setPoints(Canvas canvas, Float xP, Float Yp)

Vous pouvez garder un cache des dessins précédents (ou stocker les points précédents)

1voto

Essayez de déclarer canvas2 comme une variable publique dans la classe DrawView.

1voto

DeeV Points 16141

Vous dessinez vos cercles dans onDraw() . C'est ainsi que View est censée fonctionner (techniquement, elle se trouve en fait dans l'application draw() mais nous n'en tiendrons pas compte). Sur setPoints() définit les points du cercle dans les variables de la classe, appelle invalidate() puis dessinez le cercle comme ça dans onDraw() . Si vous suivez cette méthode, vous suivez le flux de classe pour lequel la vue a été conçue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X