2011-02-07 20 views
5

Ho un'app di disegno che consente all'utente di disegnare su una tela vuota. Sto tentando di disegnare una "miniatura" ridimensionata della bitmap corrente in modo che quando l'utente è ridimensionato nella vista, possono fare riferimento alla miniatura per avere un'idea di dove si trovano nella tela di disegno generale. Ho il ridimensionamento funzionante e sto visualizzando la miniatura nella posizione corretta, ma sembra che la miniatura non venga aggiornata sui successivi suDraw quando vengono aggiunte nuove linee/forme.Bitmap Canvas Scaling Android

in modo da avere accesso al bitmap sottostante per questa vista (per mostrare la miniatura, in grado di salvare facilmente la bitmap in un file, ecc) io quanto segue in onSizeChanged() per la vista:

@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); 
} 

Poi, quando l'utente richiama e invalidate() viene chiamato, faccio quanto segue in OnDraw() per generare la miniatura:

@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 miniatura viene visualizzata nello spazio definito dal thumbnailRectF utilizzando il thumbCanvasPaint , ma nelle chiamate successive suDraw(), la bitmap ridimensionata ha non modificato dal suo stato originale, anche se la tela attiva a dimensione intera mostra tutti i disegni, ecc. Sulla base di alcuni test, mi sembra che mentre sto impostando la Bitmap con la chiamata iniziale per disegnare (mCanvas) ;, successivamente, onDraws sta scrivendo sulla Bitmap sottostante piuttosto che su quella specificata in onSizeChanged().

Quindi, credo che sto cercando di capire come legare la tela onDraw a una bitmap che posso leggere l'accesso per eseguire ridimensionamenti, salvare, ecc. Guardando a this question, ho pensato che il disegno (mCanvas) ; call collegherebbe onDraw alla bitmap specificata in mCanvas (nel mio caso, mBitmap), ma in pratica non sembra funzionare, nella misura in cui sono interessati gli aggiornamenti alla tela.

Grazie,

Paul

risposta

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

dovrebbe cambiare in

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

Non v'è alcuna necessità di

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

Verificare inoltre che mScaled è vero tutto il tempo in cui lo zoom è gre ater di 1

+0

riesco a vedere la somiglianza della soluzione whith questo esempio: http://www.barebonescoder.com/2010/06/android-development-simple-2d-graphics-part-1/ – Lumis

+0

Wow, sì, il programma collegato è costruito quasi al 100% lo stesso, tranne per il mio problema con la legatura della bitmap al canvas, ecc. Provando questa soluzione ora. –

0

Scala bitmap Bitmap.createScaledBitmap quindi disegnare non funzionerà

La soluzione per bilancia la bitmap tela è utilizzare questa funzione (dal 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 

così cambiando la dimensione di dst , la dimensione della bitmap cambierà

Ecco un esempio se voglio disegnare una bitmap in alto a sinistra e ridimensionarla a 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);