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

Как я могу получить изображение на холсте, чтобы рисовать на этом изображении?


person Lana    schedule 03.03.2011    source источник


Ответы (6)


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

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

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

person Gábor    schedule 08.04.2014
comment
Как использовать список анимаций (несколько кадров) для анимации с использованием холста? - person RichieHH; 27.07.2014
comment
Очень полезно! По крайней мере, когда вам нужна просто фоновая картинка без участия ракетостроения! - person Asim; 06.01.2015
comment
@RichieHH У меня есть фон на SurfaceView (вероятно, пустая трата), и этот вид поверхности встроен в Framelayout, а этот framelayout содержит ImageViews, которые я затем анимирую - может быть, это вариант для вас? - person AgentKnopf; 27.04.2015
comment
getDrawable(id) устарел, вы должны либо использовать вызов ContextCompat выше, либо вызов getDrawable(id, theme). developer.android.com/reference/android/content /рез/ - person wblaschko; 03.12.2016
comment
@Saveen: ты уверен? Насколько я помню, это должно работать с самых ранних версий Android. - person Gábor; 18.08.2017

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

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

Затем сделайте растровое изображение изменяемым и создайте поверх него холст:

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

Затем вы можете рисовать на холсте.

person Konstantin Burov    schedule 03.03.2011
comment
Что делать, если мой .png большой и обрезается после загрузки? т. е. я не хочу его обрезать. Он может быть больше экрана, тогда я постараюсь сделать его масштабируемым и подвижным. Как я могу это сделать? Огромное спасибо! - person Sibbs Gambling; 04.07.2013
comment
@ perfectionm1ng посмотрите на использование BitmapRegionDecoder. Это позволяет частичную загрузку больших изображений. Таким образом, вы должны иметь возможность загружать только ту часть изображения, которую вы визуализируете в данный момент. - person Konstantin Burov; 05.07.2013
comment
У меня та же проблема. Я использую код 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); if(text.equals(Хорошо)) { cs.drawBitmap(bitmapx, 0, 0, tPaint); } else { cs.drawBitmap (bitmapxx, 0, 0, tPaint); } - person Ahmad Arslan; 10.02.2014
comment
Как создание нового объекта холста рисует на холсте onDraw? - person Siddarth G; 12.02.2020

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

Resources res = getResources();
Bitmap bitmap = BitmapFactory.decodeResource(res, yourDrawable);
yourCanvas.drawBitmap(bitmap, 0, 0, yourPaint);
person AzizAhmad    schedule 29.03.2015
comment
В классе BitmapFactory нет метода BitmapFactory.decodeResource(Resource, Drawable);... - person Crisic; 11.01.2016
comment
@Crisic Я бы предположил, что yourDrawable является целым числом. - person ; 04.02.2017

попробуй это

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

        }
person Rohit Mandiwal    schedule 03.03.2011
comment
Но если я использую canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); он работает и загружает сохраненное изображение на холст, но в то же время отмена и повтор перестают работать. Проверьте мой код pastebin. com/cP9w6stm - person AndroidDev; 02.05.2013

Чтобы сохранить соотношение сторон моего векторного рисунка, я сделал это:

val drawable = resources.getDrawable(R.drawable.my_vector, null)
val aspectRatio = drawable.intrinsicWidth.toFloat() / drawable.intrinsicHeight
val desiredWidthInPx = 100
val derivedHeightInPx = (desiredWidthInPx / aspectRatio).toInt()
drawable.setBounds(0, 0, desiredWidthInPx, derivedHeightInPx)
drawable.draw(canvas)
person Mahozad    schedule 21.05.2021

person    schedule
comment
Я создаю Drawable с помощью gerResource().getDrawable(id); - person Vikram; 23.09.2016
comment
getDrawable(id) устарел, вы должны либо использовать вызов ContextCompat выше, либо вызов getDrawable(id, theme). developer.android.com/reference/android/content /рез/ - person wblaschko; 03.12.2016
comment
Для меня было необходимо использовать setBounds. Без него ничего не отображалось. - person ; 04.02.2017