2011-03-03 29 views

Respuesta

7

probar esto

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

Pero si uso canvas.drawBitmap (mBitmap, 0, 0, mBitmapPaint); funciona y carga la imagen guardada en el lienzo, pero al mismo tiempo, deshacer y rehacer dejar de funcionar, verificar mi código http://pastebin.com/cP9w6stm – AndroidDev

35

Es necesario para cargar la imagen como mapa de bits:

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

luego hacer el mapa de bits mutable y crear un lienzo sobre ella:

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

A continuación, puede dibujar en el lienzo.

+0

¿Qué pasa si mi .png es grande y se corta después de ser cargado ? es decir, no quiero recortarlo. Puede ser más grande que la pantalla, luego intentaré hacerlo escalable y móvil. ¿Cómo puedo hacer eso? ¡Muchísimas gracias! –

+1

@ perfectionm1ng vistazo al uso de BitmapRegionDecoder. Permite carga parcial para imágenes grandes. Por lo tanto, debería poder cargar solo la parte de la imagen que está renderizando en este momento. –

+0

Tengo el mismo problema. Estoy usando el código Canvas cs = new Canvas (mapa de bits); Recursos res = getResources(); Bitmap bitmapx = BitmapFactory.decodeResource (res, R.drawable.overlay_good_full); Bitmap bitmapxx = BitmapFactory.decodeResource (res, R.drawable.overlay_bad_full); if (text.equals ("Bueno")) { cs.drawBitmap (bitmapx, 0, 0, tPaint); } else { 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

crear un nuevo objeto Paint en onDraw es malo para el rendimiento –

+0

está bien .. he actualizado la respuesta – user1140237

118

La buena manera de dibujar un Disponibles en una tela no decodifica por sí mismo, sino dejando que el sistema para hacerlo:

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

Esto funciona con todo tipo de dibujables, no sólo los mapas de bits. Y también significa que puede reutilizar ese mismo dibujo nuevamente si solo cambia el tamaño.

+0

¿Cómo se usa una lista de animación (varios fotogramas) para la animación con el enfoque de lienzo? – RichieHH

+0

¡Muy útil! ¡Al menos cuando solo necesitas una imagen de fondo sin ciencia espacial involucrada! – Asim

+0

@RichieHH Tengo mi experiencia en un SurfaceView (probablemente un desperdicio) y esa vista de superficie está incrustada en un Framelayout y ese framelayout contiene ImageViews que luego animaré. ¿Tal vez esa sea una opción para ti? – AgentKnopf

8

también se puede utilizar de esta manera. que va a cambiar su ajuste drawble grande para su lienzo:

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

La clase BitmapFactory no tiene el método "BitmapFactory.decodeResource (Resource, Drawable);" ... – Crisic

+0

@Crisic Supongo que 'yourDrawable' es un número entero. –

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

Creo Drawable con gerResource(). GetDrawable (id); – Vikram

+0

getDrawable (id) está en desuso, debe usar la llamada ContextCompat anterior o la llamada getDrawable (id, theme). https://developer.android.com/reference/android/content/res/Resources.html#getDrawable(int) – wblaschko

+0

Para mí, era necesario usar 'setBounds'. Sin eso, no se mostró nada. –

Cuestiones relacionadas