如何将自定义视图转换为位图?

3
我已经准备了一个自定义视图。我的视图包含一个字母,我使用onDraw()中的drawText绘制。现在我需要将这个视图更改为位图。
这是我的OnDraw()方法:
public void onDraw(Canvas canvas) {

   drawText("A",100,200,mPaint); 
  }

我需要将这个视图转换为位图...请帮忙...提前致谢。
3个回答

5

对于那些已经设置好自己的视图并想要比AutoCoders更短的解决方案的人:

Bitmap result = Bitmap.createBitmap(dst.getWidth(), dst.getHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(result);
dst.draw(c);

执行完后,Bitmap 'result' 将包含您的视图。
'dst' 是您想要作为位图的视图。


有没有办法控制canvas实例中dst的位置? - Guokas
请看这个问题:https://dev59.com/jmDVa4cB1Zd3GeqPbDiw - Jave

4
Bitmap viewCapture = null;

theViewYouWantToCapture.setDrawingCacheEnabled(true);

viewCapture = Bitmap.createBitmap(theViewYouWantToCapture.getDrawingCache());

theViewYouWantToCapture.setDrawingCacheEnabled(false);

1
在Android中,“位图”一词是一个类,它帮助我们将图像作为位图或位数组进行处理。当我们使用Canvas或OpenGL等图形界面时,这个Bitmap类非常有用。
Canvas是Java中另一个已知的类,用于绘制事物。在Canvas中,我们可以控制所有像素。
我们需要初始化一些变量,
这是我们要绘制的画布。
Canvas canvas = null

这是我们将用来创建视图的布局。

RelativeLayout relativeView ;

这是我们将在视图中设置的背景,我们从资源文件(R.drawable.blackBgrnd)中获取它。使用BitmapFactory.decodeResource方法获取资源图像并将其转换为位图(我们将使用Bitmap类)。必须从我们正在处理的Activity传递mContext对象(上下文)。

Bitmap viewBgrnd = BitmapFactory.decodeResource(mContext.getResources(),R.drawable.blackBgrnd);

我们需要另一个位图,在画布上绘制它。我们将这个位图的宽度和高度设置为相对于我们在布局中创建的宽度和高度。现在这个位图是空的,但我们将把它与画布关联起来,这样每次在画布上绘制时,它都会被绘制在这个位图对象中。
Bitmap returnedBitmap = Bitmap.createBitmap(relativeView .width, relativeView.height,Bitmap.Config.ARGB_8888);

首先,我们有了canvas = null,现在我们使用之前创建的辅助位图创建一个Canvas对象。
canvas = new Canvas(auxBitmap);

现在是创建我们的视图的时候了。

我们可以添加图片,例如:

ImageView newImage = new ImageView(mContext);

newImage.setImageBitmap(bitmapWithImage)

我们可以使用“layout”方法在视图中设置imageView的位置:
newImage.layout(l,t,r,b);

l 左侧位置,相对于父级 t 顶部位置,相对于父级 r 右侧位置,相对于父级 b 底部位置,相对于父级 最后将其添加到我们的布局中:

relativeView.addView(newImage);

或者我们可以添加文本:

TextView newText = new TextView(mContext);

newText.setText(“This is the text that its going to appear”);

将其以相同的方式添加到布局中:
relativeView.addView(newText);

一旦我们将所有要添加到布局中的元素都添加完毕,我们就必须创建一个绘制对象:

Paint paint = new Paint();

只是用来定义画布的默认值。

我们使用画布的“drawBitmap”方法:

canvas.drawBitmap(ViewBgrnd, 0, 0, paint);

最后,我们在布局中调用dispatchDraw来在画布上绘制子视图(imageView、textView)。
relativeView.dispatchDraw(canvas);

returnedBitmap是包含画布中视图绘制的位图,我们在其中有布局及其子项作为位图,在Canvas中绘制它们。

结论

这真的很棘手,也许很难理解。我花了一些时间才明白它是如何工作的。我会尝试总结一下:

我们需要创建一个空位图。这个位图将是最终带有视图的位图。 我们使用该位图创建画布。 我们创建一个布局并添加尽可能多的元素。 我们将布局附加到画布上。 因为我们使用位图对象创建了画布,所以在画布中绘制的所有内容都将绘制在位图中。

来自:Bright hub


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接