2011-03-03 4 views

Répondre

7

essayer cette

Bitmap mBitmap = Bitmap.createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter); 

protected void onDraw(Canvas canvas) { 
      canvas.drawColor(0xFFAAAAAA); 
      canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 

     } 
+0

Mais si j'utilise canvas.drawBitmap (mBitmap, 0, 0, mBitmapPaint); cela fonctionne et il charge l'image enregistrée sur le canevas, mais en même temps annuler et refaire arrêter de travailler, Vérifiez mon code http://pastebin.com/cP9w6stm – AndroidDev

35

Vous devez charger votre image bitmap:

Resources res = getResources(); 
Bitmap bitmap = BitmapFactory.decodeResource(res, R.drawable.your_image); 

ensuite faire le bitmap mutable et de créer une toile au-dessus:

Canvas canvas = new Canvas(bitmap.copy(Bitmap.Config.ARGB_8888, true)); 

Vous pouvez ensuite peut dessiner sur la toile.

+0

Que faire si mon .png est grand et il se coupe après avoir été chargé ? c'est-à-dire que je ne veux pas l'avoir recadrée. Il peut être plus grand que l'écran, alors je vais essayer de le rendre zoomable et mobile. Comment puis-je faire ça? Merci beaucoup! –

+1

@ perfectionm1ng regarde en utilisant BitmapRegionDecoder. Il permet un chargement partiel pour les grandes images. Vous ne devriez donc pouvoir charger que la partie de l'image que vous affichez en ce moment. –

+0

J'ai le même problème J'utilise le code Canvas cs = new Canvas (bitmap); Ressources res = getResources(); Bitmap bitmapx = BitmapFactory.decodeResource (res, R.drawable.overlay_good_full); Bitmap bitmapxx = BitmapFactory.decodeResource (res, R.drawable.overlay_bad_full); si (text.equals ("Bon")) { cs.drawBitmap (bitmapx, 0, 0, tPaint); } sinon { cs.drawBitmap (bitmapxx, 0, 0, tPaint); } –

1
package com.android.jigsawtest; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class SurafaceClass extends SurfaceView implements 
     SurfaceHolder.Callback { 
    Bitmap mBitmap; 
Paint paint =new Paint(); 
    public SurafaceClass(Context context) { 
     super(context); 
     mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     canvas.drawColor(Color.BLACK); 
     canvas.drawBitmap(mBitmap, 0, 0, paint); 

    } 

} 
+2

créer un nouvel objet Paint dans onDraw est mauvais pour la performance –

+0

okay thnks .. j'ai hve mis à jour la réponse – user1140237

118

La bonne façon de dessiner un Drawable sur une toile est pas le décodage vous, mais en laissant au système de le faire:

Drawable d = getResources().getDrawable(R.drawable.foobar); 
d.setBounds(left, top, right, bottom); 
d.draw(canvas); 

Cela fonctionne avec toutes sortes de dessinables, non seulement bitmaps. Et cela signifie aussi que vous pouvez réutiliser ce même dessin si seulement la taille change.

+0

Comment utilise-t-on une animation-liste (images multiples) pour l'animation avec l'approche de la toile? – RichieHH

+0

Très utile! Au moins quand vous avez besoin d'une image de fond sans science de fusée impliqué! – Asim

+0

@RichieHH J'ai mes antécédents sur un SurfaceView (propably un gaspillage) et cette vue de surface est intégrée dans un Framelayout et que framelayout contient ImageViews que j'anime alors - c'est peut-être une option pour vous? – AgentKnopf

8

également vous pouvez utiliser de cette façon. il va changer votre grand ajustement drawble à votre toile:

Resources res = getResources(); 
Bitmap bitmap = BitmapFactory.decodeResource(res, yourDrawable); 
yourCanvas.drawBitmap(bitmap, 0, 0, yourPaint); 
+0

La classe BitmapFactory n'a pas la méthode "BitmapFactory.decodeResource (Resource, Drawable);" ... – Crisic

+0

@Crisic Je suppose que 'yourDrawable' est un nombre entier. –

7
Drawable d = ContextCompat.getDrawable(context, R.drawable.***) 
d.setBounds(left, top, right, bottom); 
d.draw(canvas); 
+0

Je crée Drawable avec gerResource(). GetDrawable (id); – Vikram

+0

getDrawable (id) est en cours d'abandon, vous devez utiliser l'appel ContextCompat ci-dessus ou l'appel getDrawable (id, theme). https://developer.android.com/reference/android/content/res/Resources.html#getDrawable(int) – wblaschko

+0

Pour moi, il était nécessaire d'utiliser 'setBounds'. Sans cela, rien n'a été affiché. –

Questions connexes