Tuval üzerine çekilebilir resim


Yanıtlar:


184

Bir tuval üzerine Drawable çizmenin en iyi yolu, onu kendiniz çözmek değil, bunu yapmak için sisteme bırakmaktır:

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

Bu, yalnızca bit eşlemlerle değil, her türden çekilebilir öğelerle çalışacaktır. Ayrıca, aynı çekmeceyi yalnızca boyut değişirse tekrar kullanabileceğiniz anlamına gelir.


Tuval yaklaşımıyla animasyon için bir animasyon listesi (birden çok kare) nasıl kullanılır?
RichieHH

1
Çok kullanışlı! En azından roket biliminin dahil olmadığı bir arka plan resmine ihtiyacınız olduğunda!
Asim

@RichieHH Bir SurfaceView üzerinde arka planım var (muhtemelen bir atık) ve bu yüzey görünümü bir Framelayout'a gömülü ve bu çerçeve düzeni, daha sonra canlandırdığım ImageViews içeriyor - belki bu sizin için bir seçenek?
AgentKnopf

4
getDrawable (id) kullanımdan kaldırılıyor, ya yukarıdaki ContextCompat çağrısını ya da getDrawable (id, tema) çağrısını kullanmalısınız. developer.android.com/reference/android/content/res/…
wblaschko

@Saveen: Emin misin? Hatırlayabildiğim kadarıyla, bunun Android'in en eski sürümlerinden itibaren çalışması gerekiyordu.
Gábor

39

Resminizi bit eşlem olarak yüklemeniz gerekir:

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

Ardından bitmap'i değiştirilebilir yapın ve üzerinde bir tuval oluşturun:

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

Daha sonra tuval üzerine çizim yapabilirsiniz.


Ya .png dosyam büyükse ve yüklendikten sonra kesilirse? yani, kırpılmasını istemiyorum. Ekrandan daha büyük olabilir, o zaman onu yakınlaştırılabilir ve taşınabilir hale getirmeye çalışacağım. Bunu nasıl yapabilirim? Çok çok teşekkür ederim!
Sibbs Gambling

1
@ perfectionm1ng BitmapRegionDecoder'ı kullanmaya bakın. Büyük resimler için kısmi yüklemeye izin verir. Bu nedenle, şu anda oluşturduğunuz görüntünün yalnızca bölümünü yükleyebilmelisiniz.
Konstantin Burov

Kanvas cs = new Canvas (bitmap) kodunu kullanıyorum da aynı problemi yaşıyorum; Kaynaklar 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 ("İyi")) {cs.drawBitmap (bitmapx, 0, 0, tPaint); } else {cs.drawBitmap (bitmapxx, 0, 0, tPaint); }
Ahmad Arslan

Yeni tuval nesnesi oluşturmak, onDraw'un tuvaline nasıl çizim yapar?
Siddarth G

14

bu şekilde de kullanabilirsiniz. tuvalinize büyük çekilebilir uyumu değiştirecek:

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

BitmapFactory sınıfı, "BitmapFactory.decodeResource (Resource, Drawable);" ... yöntemine sahip değil ...
Crisic

@Crisic Bunun yourDrawablebir tamsayı olduğunu varsayıyorum .

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

GerResource (). GetDrawable (id) ile Drawable oluşturuyorum;
Vikram

getDrawable (id) kullanımdan kaldırılıyor, ya yukarıdaki ContextCompat çağrısını ya da getDrawable (id, tema) çağrısını kullanmalısınız. developer.android.com/reference/android/content/res/…
wblaschko

1
Benim için kullanmak gerekliydi setBounds. Onsuz hiçbir şey gösterilmez.

8

bunu dene

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

        }

Ama canvas.drawBitmap (mBitmap, 0, 0, mBitmapPaint) kullanırsam; çalışıyor ve kaydedilen görüntüyü tuvale yüklüyor, ancak aynı zamanda geri al ve yeniden yap çalışmayı durdur,
Kodumu

2
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);

    }

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.