Рисуемое изображение на холсте


Ответы:


181

Хороший способ нарисовать Drawable на холсте - это не декодировать его самостоятельно, а оставить это делать системе:

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

Это будет работать со всеми видами чертежей, а не только с растровыми изображениями. И это также означает, что вы можете повторно использовать тот же объект для рисования снова, если изменится только размер.


Как использовать список анимации (несколько кадров) для анимации с использованием холста?
RichieHH

1
Очень полезно! По крайней мере, когда вам нужна только фоновая картинка без участия ракетостроения!
Asim

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

4
getDrawable (id) устарел, вам следует использовать либо вызов ContextCompat, указанный выше, либо вызов getDrawable (id, theme). developer.android.com/reference/android/content/res/…
wblaschko 02

@Saveen: Ты уверен? Насколько я помню, это должно работать с самых ранних версий Android.
Gábor

39

Вам нужно загрузить изображение как растровое изображение:

 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 (bitmap); Ресурсы res = getResources (); Bitmap bitmapx = BitmapFactory.decodeResource (res, R.drawable.overlay_good_full); Bitmap bitmapxx = BitmapFactory.decodeResource (res, R.drawable.overlay_bad_full); если (text.equals ("Хорошо")) {cs.drawBitmap (bitmapx, 0, 0, tPaint); } else {cs.drawBitmap (bitmapxx, 0, 0, tPaint); }
Ахмад Арслан

Как создание нового объекта холста отрисовывается на холсте onDraw?
Siddarth G,

14

также вы можете использовать этот способ. это изменит размер вашего большого рисунка на холсте:

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

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

@Crisic Я бы предположил, что yourDrawableэто целое число.

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

Я создаю Drawable с помощью gerResource (). GetDrawable (id);
Викрам

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); он работает, и он загружает сохраненное изображение на холст, но в то же время отмена и повтор перестают работать, проверьте мой код pastebin.com/cP9w6stm
AndroidDev

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.