Малюнок на полотні


Відповіді:


178

Хороший спосіб намалювати малюнок на полотні - це не декодування його самостійно, а залишення цього за системою:

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

Це буде працювати з усіма типами малюнків, а не лише з растровими зображеннями. А це також означає, що ви можете повторно використовувати той самий малювальник, якщо зміниться лише розмір.


Як використовувати анімаційний список (кілька кадрів) для анімації з підходом до полотна?
RichieHH

1
Дуже корисний! Принаймні, коли вам потрібен лише фоновий малюнок без участі ракетної науки!
Асім

@RichieHH У мене є досвід роботи з SurfaceView (можливо, це відходи), і цей вид поверхні вбудований у Framelayout, і цей framelayout містить ImageViews, які я потім анімую - можливо, це варіант для вас?
AgentKnopf

4
getDrawable (id) не підтримується, вам слід використовувати або виклик ContextCompat вище, або виклик getDrawable (id, theme). developer.android.com/reference/android/content/res/…
wblaschko

@Saveen: Ви впевнені? Наскільки я пам’ятаю, це повинно працювати з найдавніших версій Android.
Габор,

38

Вам потрібно завантажити зображення як растрове зображення:

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

Потім зробіть растрове зображення змінним і створіть над ним полотно:

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

Потім можна малювати на полотні.


Що робити, якщо мій файл .png великий, і він буде вирізаний після завантаження? тобто я не хочу, щоб його обрізали. Він може бути більшим за екран, тоді я постараюся зробити його масштабованим та рухомим. Як я можу це зробити? Щиро дякую!
Sibbs Gambling

1
@ perfectionm1ng подивіться на використання BitmapRegionDecoder. Це дозволяє частково завантажувати великі зображення. Отже, ви повинні мати можливість завантажувати лише ту частину зображення, яку ви рендеруєте на даний момент.
Костянтин Буров

У мене така сама проблема, як і при використанні коду Canvas cs = new Canvas (растрове зображення); Ресурси 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 ("Добре")) {cs.drawBitmap (bitmapx, 0, 0, tPaint); } ще {cs.drawBitmap (bitmapxx, 0, 0, tPaint); }
Ахмад Арслан

Як створення нового об'єкта полотна малює на полотні onDraw?
Сіддарт Г

13

також ви можете використовувати цей спосіб. це змінить ваш великий висувний прилад на вашому полотні:

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

Клас BitmapFactory не має методу "BitmapFactory.decodeResource (Resource, Drawable);" ...
Crisic

@Crisic Я б припустив, що yourDrawableце ціле число.

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

Я створюю Drawable за допомогою gerResource (). GetDrawable (id);
Vikram

getDrawable (id) не підтримується, вам слід використовувати або виклик ContextCompat вище, або виклик getDrawable (id, theme). developer.android.com/reference/android/content/res/…
wblaschko 02

1
Для мене це було необхідно використовувати setBounds. Без цього нічого не відображалося.

8

спробуйте це

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

        }

Але якщо я використовую canvas.drawBitmap (mBitmap, 0, 0, mBitmapPaint); він працює, і завантажує збережене зображення на полотно, але одночасно
скасовує і повторює

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

    }

}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.