75 lines
2.1 KiB
Kotlin
75 lines
2.1 KiB
Kotlin
|
package io.xdrm.lebonprix.anim
|
||
|
|
||
|
import android.content.Context
|
||
|
import android.graphics.*
|
||
|
import android.support.v4.content.res.ResourcesCompat
|
||
|
import android.view.animation.Animation
|
||
|
import android.view.animation.Transformation
|
||
|
import android.widget.ImageView
|
||
|
import io.xdrm.lebonprix.R
|
||
|
|
||
|
class ResultOpeningAnimation(
|
||
|
val ctx: Context,
|
||
|
val target: ImageView
|
||
|
) : Animation() {
|
||
|
|
||
|
|
||
|
// VARIABLES
|
||
|
private var width: Int = 1000
|
||
|
private var height: Int = 1000
|
||
|
|
||
|
private var bitmap : Bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
|
||
|
private var canvas : Canvas = Canvas(bitmap)
|
||
|
|
||
|
private var progress: Float = 0F
|
||
|
|
||
|
init {
|
||
|
target.addOnLayoutChangeListener { v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom ->
|
||
|
width = right-left
|
||
|
height = bottom-top
|
||
|
|
||
|
// unregister previous
|
||
|
target.setImageBitmap(null)
|
||
|
canvas.setBitmap(null)
|
||
|
bitmap.recycle()
|
||
|
|
||
|
// build new
|
||
|
bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
|
||
|
canvas = Canvas(bitmap)
|
||
|
target.setImageBitmap(bitmap)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
override fun start() {
|
||
|
target.startAnimation(this)
|
||
|
}
|
||
|
|
||
|
override fun applyTransformation(interpolatedTime: Float, t: Transformation?) {
|
||
|
super.applyTransformation(interpolatedTime, t)
|
||
|
progress = interpolatedTime
|
||
|
draw()
|
||
|
}
|
||
|
|
||
|
private fun draw(){
|
||
|
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR)
|
||
|
|
||
|
drawFilter()
|
||
|
|
||
|
target.setImageBitmap(bitmap)
|
||
|
}
|
||
|
|
||
|
private fun drawFilter(){
|
||
|
val bg = Paint()
|
||
|
bg.color = ResourcesCompat.getColor(ctx.resources, R.color.colorBackground, null)
|
||
|
|
||
|
// max radius to hide the whole screen
|
||
|
val maxRad = Math.sqrt( Math.pow(width.toDouble(),2.toDouble()) + Math.pow(height.toDouble(), 2.toDouble())) * 1.5F // security of 1.5x the max radius
|
||
|
var rad = (1F-progress) * maxRad
|
||
|
|
||
|
// centered
|
||
|
val x = width.toFloat() / 2F
|
||
|
val y = height.toFloat() / 2F
|
||
|
|
||
|
canvas.drawCircle(x, y, rad.toFloat(), bg)
|
||
|
}
|
||
|
}
|