我读了很多关于如何将视图转换成位图的文章,其中大多数建议使用画布绘制方法,但在我的尝试中,它只返回一个透明的位图,我确信视图是正确的,因为我尝试通过在视图中添加它来显示它。我还确信视图与适当的宽度和高度相关联,下面的代码是转换。这个问题困扰了我一个星期。请帮帮我。
val widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(layoutWidthDp,View.MeasureSpec.EXACTLY)
val heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(layoutHeightDp, View.MeasureSpec.EXACTLY)
tableLayout.measure(widthMeasureSpec,heightMeasureSpec)
tableLayout.layout(0, 0, tableLayout.getMeasuredWidth(), tableLayout.getMeasuredHeight());
var bitmap = Bitmap.createBitmap(tableLayout.width, tableLayout.height, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
tableLayout.draw(canvas)
previewBitmap = bitmap
previewIV = findViewById(R.id.finalLayoutPreviewIV)
previewIV?.setImageBitmap(previewBitmap)我的目标视图是不显示的视图。我不知道这不是与问题有关,我把创建过程放在下面。
val tableLayout = TableLayout(this)
tableLayout.setLayoutParams( TableLayout.LayoutParams(layoutWidthDp,layoutHeightDp))
tableLayout.removeAllViews()
Log.d("", tableLayout.layoutParams.toString())
val padding = convertMMToDp(5F,resources).toInt()
val widthDp = convertMMToDp(photoSizeWidth.toFloat(),resources).toInt()
val heightDp = convertMMToDp(photoSizeHeight.toFloat(),resources).toInt()
val colAmount = layoutWidthDp/ (widthDp+padding*2)
val rowAmount = layoutHeightDp/ (heightDp+padding*2)
for (i in 1..rowAmount){
val tableRow = TableRow(this)
tableRow.setLayoutParams(
TableRow.LayoutParams(
TableRow.LayoutParams.FILL_PARENT,
TableRow.LayoutParams.WRAP_CONTENT
)
)
for (j in 1..colAmount){
val layout = RelativeLayout(applicationContext)
val photoItemVI = ImageView(applicationContext)
if (photoPrototype.type?.background == "#FFFFFF") {
layout.setBackgroundColor(getColor(R.color.color_light_white))
}
layout.addView(photoItemVI)
photoItemVI.post(Runnable {
val params = RelativeLayout.LayoutParams(
widthDp, heightDp
)
params.setMargins(padding)
photoItemVI.setLayoutParams(params)
photoItemVI.setBackgroundColor(Color.parseColor(photoPrototype.type?.background))
photoItemVI.setImageURI(photoPrototype.photo_without_background)
photoItemVI.scaleType = ImageView.ScaleType.CENTER_CROP
photoItemVI.layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT)
layout.updateViewLayout(photoItemVI, params);
})
tableRow.addView(layout)
}
tableLayout.addView(tableRow)
}发布于 2021-09-06 04:22:17
我想您忘记了Canvas类的drawColor方法,它应该按照createBitmap中Bitmap指定的画布大小绘制一种颜色
这基本上类似于截屏,我是这样实现的,注意drawColor和inputBackground采用的颜色会根据设备的主题而变化,并将作为Canvas的背景
public static Bitmap takeScreenshot(View rootView) {
Bitmap bitmap = Bitmap.createBitmap(rootView.getWidth(), rootView.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
canvas.drawColor(ContextCompat.getColor(rootView.getContext(), R.color.inputBackground));
rootView.draw(canvas);
return bitmap;
}https://stackoverflow.com/questions/69069028
复制相似问题