2011-02-07 5 views
5

J'ai une application de dessin qui permet à l'utilisateur de dessiner sur une toile vierge. J'essaie de dessiner une «vignette» mise à l'échelle de l'image bitmap actuelle de sorte que lorsque l'utilisateur a mis à l'échelle dans la vue, ils peuvent référencer la vignette pour avoir une idée de l'endroit où ils se trouvent dans la toile de dessin globale. J'ai la mise à l'échelle qui fonctionne, et affiche la vignette à l'emplacement correct, mais il semble que la vignette ne soit pas mise à jour sur les onDraws suivants lorsque de nouvelles lignes/formes sont ajoutées.Android Scaling Canvas Bitmap

Alors que j'ai accès au bitmap sous-jacente de ce point de vue (pour montrer la vignette, être en mesure d'enregistrer facilement le bitmap dans un fichier, etc.) Je fais ce qui suit dans OnSizeChanged() pour la vue:

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 

    // set the canvas height, panning, etc, based on the now inflated View 
    mWidth  = getWidth(); 
    mHeight  = getHeight(); 
    mAspectRatio = mWidth/mHeight; 
    mPanX  = 0; 
    mPanY  = 0; 

    // create the Bitmap, set it to the canvas 
mBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888); 
mCanvas.setBitmap(mBitmap); 
draw(mCanvas); 
} 

Ensuite, lorsque l'utilisateur tire et invalident() est appelée, je fais ce qui suit dans onDraw() pour générer la vignette:

@Override 
protected void onDraw(Canvas canvas) { 
    <snipped code that draws paths, shapes to canvas> 

    if (mScaled) { 
     Bitmap out = Bitmap.createScaledBitmap(mBitmap, (int) thumbWidth, (int) thumbHeight, false); 
     canvas.drawBitmap(out, null, thumbnailRectF, thumbCanvasPaint); 
    } 
} 

la miniature s'affiche dans l'espace défini par thumbnailRectF en utilisant la thumbCanvasPaint , mais dans les appels onDraw() suivants, le bitmap mis à l'échelle a pas changé de son état d'origine, même si le canevas actif en taille réelle affiche tous les dessins, etc. Basé sur des tests, il me semble que pendant que je mets le Bitmap avec l'appel initial à dessiner (mCanvas) ;, Les onDraw suivants écrivent dans le bitmap sous-jacent plutôt que dans celui spécifié dans onSizeChanged(). Donc, je suppose que j'essaie de comprendre comment j'attache la toile onDraw à un bitmap que je peux accéder à nouveau pour effectuer des re-tailles, enregistrer, etc .. En regardant this question, je pensais que le tirage au sort (mCanvas) ; call lierait l'onDraw au bitmap spécifié dans le mCanvas (dans mon cas, mBitmap), mais en pratique, il ne semble pas fonctionner, dans la mesure où les mises à jour sur le canvas sont concernées.

Merci,

Paul

Répondre

6
canvas.drawBitmap(out, null, thumbnailRectF, thumbCanvasPaint); 

devrait changer pour

canvas.drawBitmap(out, new Rect(0,0,mBitmap.getWidht, mBitmap.getheight), thumbnailRectF, thumbCanvasPaint); 

Il n'y a pas besoin de

Bitmap out = Bitmap.createScaledBitmap(mBitmap, (int) thumbWidth, (int).... 

Vérifiez également que mScaled est vrai tout le temps quand le zoom est gre ater que 1

+0

Je vois similitude de votre solution cinque cet exemple: http://www.barebonescoder.com/2010/06/android-development-simple-2d-graphics-part-1/ – Lumis

+0

Wow, oui, Le programme lié est construit presque à 100% de la même manière, à l'exception de mon problème avec l'attachement du bitmap à la toile, etc. Essayer cette solution maintenant. –

0

bitmap échelle par Bitmap.createScaledBitmap puis tirer ne fonctionnera pas

La solution à l'échelle du bitmap de toile est d'utiliser cette fonction (du docs)

void drawBitmap (Bitmap bitmap, Rect src, Rect dst, Paint paint) 
// dst : Rect: The rectangle that the bitmap will be scaled/translated to fit into 

donc en changeant la taille de dst , votre taille de bitmap va changer

Voici un exemple si je veux dessiner un bitmap en haut à gauche et le mettre à l'échelle 100px x 120px

Bitmap bitmap = BitmapFactory.decodeResource(...);//bitmap to be drawn 

float left = 0; 
float top = 0; 
RectF dst = new RectF(left, top, left + 100, top + 120); // width=100, height=120 

canvas.drawBitmap(bitmap, null, dst, null);