LOGCAT.IO | Android 截图View的正确姿势

截图

方法1:


//方法1
    fun takePic(view: View, width: Float, height: Float, scroll: Boolean, config: Bitmap.Config?): Bitmap? {
        var width = width
        var height = height
        if (!view.isDrawingCacheEnabled) {
            //isDrawingCacheEnabled已经弃用
            view.isDrawingCacheEnabled = true
        }
        if (width == 0f) {
            width = Consts.width
        }
        if (height == 0f) {
            height = Consts.height
        }
        val bitmap = Bitmap.createBitmap(width.toInt(), height.toInt(), config!!)
        bitmap.eraseColor(Color.WHITE)
        val canvas = Canvas(bitmap)
        var left = view.left
        var top = view.top
        if (scroll) {
            left = view.scrollX
            top = view.scrollY
        }
        val status: Int = canvas.save()
        canvas.translate(-left, -top)
        val scale = width / view.width
        canvas.scale(scale, scale, left, top)
        view.draw(canvas)
        canvas.restoreToCount(status)
        val alphaPaint = Paint()
        alphaPaint.setColor(Color.TRANSPARENT)
        canvas.drawRect(0f, 0f, 1f, height, alphaPaint)
        canvas.drawRect(width - 1f, 0f, width, height, alphaPaint)
        canvas.drawRect(0f, 0f, width, 1f, alphaPaint)
        canvas.drawRect(0f, height - 1f, width, height, alphaPaint)
        canvas.setBitmap(null)
        return bitmap
    }

//方法2
    fun takePic(v: View, width: Int, height: Int, config: Bitmap.Config?): Bitmap? {
        val bmp = Bitmap.createBitmap(v.width, v.height, config!!)
        val c = Canvas(bmp)
        c.drawColor(Color.WHITE)
        v.draw(c)
        return bmp
    }

//方法3 :我认为最简单好用的方法,但是这里有个大坑,稍后再说
    fun takePic(view: View): Bitmap? {
        view.buildDrawingCache()
        return view.drawingCache
    }

//方法4
    fun takePic(v: View): Bitmap? {
        val bmp = Bitmap.createBitmap(v.width, v.height, Bitmap.Config.ARGB_8888)
        val c = Canvas(bmp)
        c.drawColor(Color.WHITE)
        v.draw(c)
        return bmp
    }

问题

上面就是所有的对View截图的方法。但是有时候会有这种情况:View变动之后,截图还是原来的view。这个时候需要刷新view的drawingcache。例如方法3说的大坑就是,你在下一次调用之前,需要调用一下view.destroyDrawingCache()。或者如果你调用了setDrawingCacheEnabled(true)的方法,你在使用结束之后需要调用setDrawingCacheEnabled(false)