Intereting Posts
Проверьте, находится ли изображение в кеше – универсальный загрузчик изображений OnConnected () не вызывается для получения обновлений местоположения (GooglePlayApi для местоположения) Снимок экрана Android OpenGL Попытка вызвать виртуальный метод 'android.content.res.AssetManager android.content.res.Resources.getAssets ()' в ссылке на нулевой объект Как объединить несколько изображений в одно изображение в Android? Android CONTENT TYPE – vnd.android.cursor.dir стандартная константа, определенная андроидом? Как создать новый макет для проекта Android (с использованием Eclipse) ProGuard вызывает задержку применения Android OpenCV Улучшение качества обнаружения Как использовать стиль уведомления по умолчанию? Есть ли способ использовать функции Java 8 с проектом библиотеки Android? Трудность понимания layout_alignWithParentIfMissing Нет доступного экземпляра типа Camera. Android – пакет org.apache.http не существует sdk 23 Правильный способ использования переменных среды системы в gradle с помощью Android Studio

Как сделать любое изображение для рисования на холст?

У меня есть короткий вопрос:

Предположим, у меня есть (изменяемый) растровый рисунок, который мне нужно изменить (добавить изображения, тексты и т. Д.).

Вместо того, чтобы возиться со многими специальными классами для рисования на холсте (краска, холст, матрицы и т. Д.), Я думал, почему бы не использовать встроенные классы Android для этой задачи, и только если мне нужны действительно настроенные операции, я все равно могу Использовать холст?

Так, например, чтобы показать какой-либо вид (который не имеет родителя, конечно) в растровом изображении, я мог бы вызвать следующую функцию:

public void drawViewToBitmap(Bitmap b, View v, Rect rect) { Canvas c = new Canvas(b); // <= use rect to let the view to draw only into this boundary inside the bitmap view.draw(c); } 

Возможно ли это? Возможно, это даже то, как он работает за кулисами?

Что я должен писать в части между рисунком и созданием холста?


EDIT: я пробовал следующий код, но он не работал:

 public void drawFromViewToCanvas(final View view, final Rect rect, final Canvas canvas) { final int widthSpec = View.MeasureSpec.makeMeasureSpec(rect.width(), View.MeasureSpec.EXACTLY); final int heightSpec = View.MeasureSpec.makeMeasureSpec(rect.height(), View.MeasureSpec.EXACTLY); view.measure(widthSpec, heightSpec); // Lay the view out with the known dimensions view.layout(0, 0, rect.width(), rect.height()); // Translate the canvas so the view is drawn at the proper coordinates canvas.save(); canvas.translate(rect.left, rect.top); // Draw the View and clear the translation view.draw(canvas); canvas.restore(); } 

Пример использования:

 final int imageSize = 50; rect = new Rect(35, 344 , 35 + imageSize, 344 + imageSize); final ImageView imageView = new ImageView(mContext); imageView.setImageBitmap(bitmap); imageView.setScaleType(ScaleType.CENTER_CROP); drawFromViewToCanvas(imageView, getRect(), canvas); 

EDIT: есть образец на веб-сайте sony :

 int measureWidth = View.MeasureSpec.makeMeasureSpec(bitmapWidth, View.MeasureSpec.EXACTLY); int measuredHeight = View.MeasureSpec.makeMeasureSpec(bitmapHeight, View.MeasureSpec.EXACTLY); view.measure(measureWidth, measuredHeight); view.layout(0, 0, bitmapWidth, bitmapHeight); view.draw(canvas); 

Интересно, работает ли это.

Solutions Collecting From Web of "Как сделать любое изображение для рисования на холст?"

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

 view.layout(0, 0, viewWidth, viewHeight); 

И если вы точно не знаете точно, что вы хотите для этих параметров ширины и высоты, вы также можете сначала его измерить:

 int widthSpec = MeasureSpec.makeMeasureSpec (ViewGroup.LayoutParams.WRAP_CONTENT, MeasureSpec.UNSPECIFIED; int heightSpec = MeasureSpec.makeMeasureSpec (400, MeasureSpec.UNSPECIFIED; view.measure(widthSpec, heightSpec); view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); 

РЕДАКТИРОВАТЬ:

Если вы уже знаете ширину и высоту, вам нужно:

 //Lay the view out with the known dimensions view.layout (0, 0, rect.width(), rect.height()); //Translate the canvas so the view is drawn at the proper coordinates canvas.save(); canvas.translate(rect.left, rect.top); //Draw the View and clear the translation view.draw(canvas); canvas.restore(); 

EDIT еще раз:

Да, проверено. Вы можете попробовать это сами:

 public class DrawingActivity extends Activity { public void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); //Set a Rect for the 200 x 200 px center of a 400 x 400 px area Rect rect = new Rect(); rect.set(100, 100, 300, 300); //Allocate a new Bitmap at 400 x 400 px Bitmap bitmap = Bitmap.createBitmap(400, 400, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); //Make a new view and lay it out at the desired Rect dimensions TextView view = new TextView(this); view.setText("This is a custom drawn textview"); view.setBackgroundColor(Color.RED); view.setGravity(Gravity.CENTER); //Measure the view at the exact dimensions (otherwise the text won't center correctly) int widthSpec = View.MeasureSpec.makeMeasureSpec(rect.width(), View.MeasureSpec.EXACTLY); int heightSpec = View.MeasureSpec.makeMeasureSpec(rect.height(), View.MeasureSpec.EXACTLY); view.measure(widthSpec, heightSpec); //Lay the view out at the rect width and height view.layout(0, 0, rect.width(), rect.height()); //Translate the Canvas into position and draw it canvas.save(); canvas.translate(rect.left, rect.top); view.draw(canvas); canvas.restore(); //To make sure it works, set the bitmap to an ImageView ImageView imageView = new ImageView(this); imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); setContentView(imageView); imageView.setScaleType(ImageView.ScaleType.CENTER); imageView.setImageBitmap(bitmap); } }