首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >View to Bitmap不能使用画布绘制方法

View to Bitmap不能使用画布绘制方法
EN

Stack Overflow用户
提问于 2021-09-06 04:08:14
回答 1查看 85关注 0票数 0

我读了很多关于如何将视图转换成位图的文章,其中大多数建议使用画布绘制方法,但在我的尝试中,它只返回一个透明的位图,我确信视图是正确的,因为我尝试通过在视图中添加它来显示它。我还确信视图与适当的宽度和高度相关联,下面的代码是转换。这个问题困扰了我一个星期。请帮帮我。

代码语言:javascript
复制
      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)

我的目标视图是不显示的视图。我不知道这不是与问题有关,我把创建过程放在下面。

代码语言:javascript
复制
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)
        }
EN

回答 1

Stack Overflow用户

发布于 2021-09-06 04:22:17

我想您忘记了Canvas类的drawColor方法,它应该按照createBitmapBitmap指定的画布大小绘制一种颜色

这基本上类似于截屏,我是这样实现的,注意drawColorinputBackground采用的颜色会根据设备的主题而变化,并将作为Canvas的背景

代码语言:javascript
复制
 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;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69069028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档