2011-03-03 15 views

Odpowiedz

7

spróbować

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

Ale jeśli mogę użyć canvas.drawBitmap (mBitmap, 0, 0, mBitmapPaint); działa i ładuje zapisany obraz na płótno, ale jednocześnie cofa się i przerabia przestaje działać, sprawdź mój kod http://pastebin.com/cP9w6stm – AndroidDev

35

Trzeba załadować obraz jako mapę bitową:

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

następnie dokonać bitmapy zmienny i stworzyć płótno nad nim:

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

następnie można rysować na płótnie.

+0

Co zrobić, jeśli mój .png jest duży i zostanie odcięty po załadowaniu ? tj. nie chcę tego przyciąć. Może być większy niż ekran, wtedy postaram się, aby był powiększalny i ruchomy. Jak mogę to zrobić? Dziękuje Ci bardzo bardzo mocno! –

+1

@ perfectionm1ng spójrz na użycie BitmapRegionDecoder. Umożliwia częściowe ładowanie dużych obrazów. Więc powinieneś być w stanie załadować tylko część obrazu, który renderujesz w danym momencie. –

+0

Mam ten sam problem Używam kodu Canvas cs = new Canvas (bitmap); Zasoby 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 ("Good")) { 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

Tworzenie nowego obiektu Paint w onDraw jest szkodliwe dla wydajności –

+0

ok .. Odpowiedzi zaktualizowałem – user1140237

118

Dobrą sposób zwrócić rozciągliwej na płótnie nie dekoduje go samodzielnie, ale pozostawiając go do systemu, aby to zrobić:

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

ta będzie współpracować ze wszystkimi rodzajami kanału alfa, nie tylko bitmapy. Oznacza to również, że można ponownie użyć tego samego rysunku, jeśli tylko zmieni się rozmiar.

+0

Jak używać listy animacji (wiele klatek) do animacji z podejściem canvas? – RichieHH

+0

Bardzo przydatne! Przynajmniej wtedy, gdy potrzebujesz tylko obrazu tła bez udziału nauki o rakietach! – Asim

+0

@RichieHH Mam moje tło na SurfaceView (prawdopodobnie odpad) i ten widok powierzchni jest osadzony w Framelayout, a ten framelayout zawiera ImageViews, które następnie animuję - może to opcja dla ciebie? – AgentKnopf

8

również można użyć w ten sposób. zmieni swój wielki drawble dopasowanie do swoich płótnie:

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

klasa BitmapFactory nie ma metody "BitmapFactory.decodeResource (Resource, Drawable);" ... – Crisic

+0

@ Crisic Zakładam, że 'yourDrawable' jest liczbą całkowitą. –

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

Tworzę Drawable z gerResource(). GetDrawable (id); – Vikram

+0

Funkcja getDrawable (id) jest przestarzała, należy użyć wywołania ContextCompat powyżej lub wywołania getDrawable (identyfikator, motyw). https://developer.android.com/reference/android/content/res/Resources.html#getDrawable(int) – wblaschko

+0

Dla mnie konieczne było użycie 'setBounds'. Bez tego nic nie zostało wyświetlone. –