package com.davidmedenjak.overlappinginvertview import android.content.Context import android.graphics.* import android.util.AttributeSet import android.view.View import android.widget.FrameLayout class InvertViewLayout(context: Context, attrs: AttributeSet? = null) : FrameLayout(context, attrs) { lateinit var backgroundView: View lateinit var overlay: View lateinit var bitmap: Bitmap val inversePaint: Paint = Paint() val rectPaint: Paint = Paint().apply { isAntiAlias = true color = Color.RED } init { // https://stackoverflow.com/q/5941926/1837367 val mx = floatArrayOf(-1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f) val cm = ColorMatrix(mx) inversePaint.colorFilter = ColorMatrixColorFilter(cm) } override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { super.onLayout(changed, left, top, right, bottom) backgroundView = getChildAt(0) overlay = getChildAt(1) bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) } override fun drawChild(canvas: Canvas, child: View, drawingTime: Long): Boolean { if (child !== overlay) { return super.drawChild(canvas, child, drawingTime) } val overlayCanvas = Canvas(bitmap) val result = super.drawChild(overlayCanvas, child, drawingTime) canvas.save() canvas.clipRect(backgroundView.left, backgroundView.top, backgroundView.right, backgroundView.bottom) canvas.drawBitmap(bitmap, 0F, 0F, inversePaint) canvas.restore() canvas.save() canvas.clipOutRect(backgroundView.left, backgroundView.top, backgroundView.right, backgroundView.bottom) canvas.drawBitmap(bitmap, 0F, 0F, null) canvas.restore() return result } }