搬砖日记

搬砖日记

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)を呼び出す必要があります。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。