3 votes

Android : La toile n'est pas mise à l'échelle

J'ai une vue personnalisée qui dessine quelques bitmaps sur le canevas dans onDraw(). Le dessin fonctionne. Regardez l'extrait de code :

@Override
protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub
    super.onDraw(canvas);
    canvas.save();

    if(appInitialized) {

        hsSide.draw(canvas);
        scaleA.draw(canvas);
        scaleB.draw(canvas);

    }
    canvas.scale(mScaleFactor, mScaleFactor, pivotX, pivotY);
    canvas.restore();
}

J'ai implémenté un ScaleGestureListener qui met à l'échelle le canevas lorsque le zoom par pincement est appliqué à l'écran. Le problème est que le canevas n'est pas mis à l'échelle. Si je mets canvas.scale(mScaleFactor, mScaleFactor, pivotX, pivotY); antes de if(appInitialized) { il met à l'échelle le canevas mais après cela le dessin, c'est à dire hsSide.draw(canvas); n'est pas à l'échelle. Il dessine à son échelle normale. Voici les méthodes de dessin :

hsDide.draw :

@Override
public void draw(Canvas canvas) {
    // TODO Auto-generated method stub
    canvas.drawBitmap(mBitmap, canvas.getWidth()/2 - mBitmap.getWidth()/2, 0, null);
}

scaleA.draw :

@Override
public void draw(Canvas canvas) {
    // TODO Auto-generated method stub
    canvas.drawBitmap(mBitmap, canvas.getWidth()/2 - mBitmap.getWidth()/2, canvas.getHeight()/2 - mBitmap.getHeight()/2, null);
}

scaleB.draw :

@Override
public void draw(Canvas canvas) {
    // TODO Auto-generated method stub

    canvas.save();
    mMatrix.setRotate(currentAngle, canvas.getWidth()/2, canvas.getHeight()/2);
    canvas.setMatrix(mMatrix);
    canvas.drawBitmap(mBitmap, canvas.getWidth()/2 - mBitmap.getWidth()/2, canvas.getHeight()/2 - mBitmap.getHeight()/2, null);
    canvas.restore();
}

Une idée de l'endroit où je me trompe... ? ???

4voto

Doomsknight Points 5998

En regardant votre code, vous devriez mettre à l'échelle le canevas avant de dessiner dessus, puis le restaurer une fois dessiné. Déplacez donc votre échelle de toile comme suit :

@Override
protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub
    super.onDraw(canvas);
    canvas.save();

   canvas.scale(mScaleFactor, mScaleFactor, pivotX, pivotY); // MOVED HERE.

    if(appInitialized) {

        hsSide.draw(canvas);
        scaleA.draw(canvas);
        scaleB.draw(canvas);

    }

    canvas.restore();
}

La taille du dessin est alors basée sur la taille de la toile. Ainsi, lorsque vous mettez la toile à l'échelle, vous la dessinez toujours dans toute sa taille, puis vous la redimensionnez à sa taille normale. Vous n'obtenez donc aucun effet.

Ce que vous devez faire, c'est prendre la taille de la toile AVANT puis passez-la également à votre méthode de dessin. Utilisez ensuite ces tailles pour dessiner sur le canevas.

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