【问题标题】:View to Bitmap not working using Canvas Draw method使用 Canvas Draw 方法查看位图不起作用
【发布时间】:2021-09-06 04:08:13
【问题描述】:

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

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

【问题讨论】:

    标签: android kotlin android-canvas android-bitmap


    【解决方案1】:

    我想你忘记了Canvas 类的drawColor 方法,该方法应该为createBitmap 中的Bitmap 指定的画布大小绘制颜色

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

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

    【讨论】:

    • 感谢您的快速响应,我尝试添加 drawColor 方法,但它只输出我提供的颜色。在我看来,表格布局中的任何更改都可以在画布中绘制(如背景颜色)。我的问题是 tableLayout 中的那些项目没有绘制到画布上。
    猜你喜欢
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 2012-11-06
    • 2016-05-14
    • 1970-01-01
    相关资源
    最近更新 更多