スクリーンショット#
方法 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)
を呼び出す必要があります。