Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 49ffc85c authored by Lucas Dupin's avatar Lucas Dupin Committed by Android (Google) Code Review
Browse files

Merge "Draw ripple effect in a circle to reduce overdraw" into sc-dev

parents 4ac1b085 19fdbc55
Loading
Loading
Loading
Loading
+14 −3
Original line number Original line Diff line number Diff line
@@ -39,9 +39,15 @@ class ChargingRippleView(context: Context?, attrs: AttributeSet?) : View(context


    var rippleInProgress: Boolean = false
    var rippleInProgress: Boolean = false
    var radius: Float = 0.0f
    var radius: Float = 0.0f
        set(value) { rippleShader.radius = value }
        set(value) {
            rippleShader.radius = value
            field = value
        }
    var origin: PointF = PointF()
    var origin: PointF = PointF()
        set(value) { rippleShader.origin = value }
        set(value) {
            rippleShader.origin = value
            field = value
        }
    var duration: Long = 1750
    var duration: Long = 1750


    init {
    init {
@@ -94,6 +100,11 @@ class ChargingRippleView(context: Context?, attrs: AttributeSet?) : View(context
    }
    }


    override fun onDraw(canvas: Canvas?) {
    override fun onDraw(canvas: Canvas?) {
        canvas?.drawRect(0f, 0f, width.toFloat(), height.toFloat(), ripplePaint)
        // To reduce overdraw, we mask the effect to a circle whose radius is big enough to cover
        // the active effect area. Values here should be kept in sync with the
        // animation implementation in the ripple shader.
        val maskRadius = (1 - (1 - rippleShader.progress) * (1 - rippleShader.progress) *
                (1 - rippleShader.progress)) * radius * 1.5f
        canvas?.drawCircle(origin.x, origin.y, maskRadius, ripplePaint)
    }
    }
}
}