Skip to content

Instantly share code, notes, and snippets.

View riggaroo's full-sized avatar
🌍

Rebecca Franks riggaroo

🌍
View GitHub Profile
@riggaroo
riggaroo / CustomView-Snippet1.kt
Last active March 21, 2019 15:25
Drawing to Canvas without KTX
canvas.save()
canvas.translate(200f, 300f)
canvas.drawCircle(...) // drawn on the translated canvas
canvas.restore()
@riggaroo
riggaroo / CanvasExt.kt
Created March 21, 2019 15:26
Sample of Canvas extension function from Android KTX
/**
* Wrap the specified [block] in calls to [Canvas.save]/[Canvas.translate]
* and [Canvas.restoreToCount].
*/
inline fun Canvas.withTranslation(
x: Float = 0.0f,
y: Float = 0.0f,
block: Canvas.() -> Unit
) {
val checkpoint = save()
@riggaroo
riggaroo / CustomView-Snippet5.kt
Created March 21, 2019 15:28
Valid with function inside parentheses
canvas.withTranslate(200f, 300f, {
drawCircle(...)
})
@riggaroo
riggaroo / CustomView-Snippet6.kt
Created March 21, 2019 15:29
Using extension function to draw to canvas.
canvas.withTranslate(200f, 300f) {
drawCircle(...)
}
@riggaroo
riggaroo / CustomView.kt
Last active March 21, 2019 15:36
Custom Canvas Drawing with KTX
canvas.withTranslation(200f, 300f) {
drawCircle(150f, 150f, RADIUS, circlePaint)
withRotation(45f) {
drawRect(rect, rectPaint)
}
}
@riggaroo
riggaroo / ValueAnimator.kt
Created March 28, 2019 12:56
Example showing how to use PropertyValuesHolder to animate a custom views properties.
private fun animateToPoint(point: Point) {
val propertyX = PropertyValuesHolder.ofFloat(ColorDropperView.PROPERTY_X, dropperPoint.x, point.x)
val propertyY = PropertyValuesHolder.ofFloat(ColorDropperView.PROPERTY_Y, dropperPoint.y, point.y)
val animator = ValueAnimator()
animator.setValues(propertyX, propertyY)
animator.interpolator = OvershootInterpolator()
animator.duration = 100
animator.addUpdateListener { animation ->
val animatedX = animation.getAnimatedValue(ColorDropperView.PROPERTY_X) as Float
@riggaroo
riggaroo / FloatPropertyCompatExamples.kt
Created March 28, 2019 12:57
Example of using FloatPropertyCompat for SpringAnimations.
private val floatPropertyAnimX = object : FloatPropertyCompat<ColorDropperView>(PROPERTY_X) {
override fun setValue(dropper: ColorDropperView?, value: Float) {
dropper?.setDropperX(value)
}
override fun getValue(dropper: ColorDropperView?): Float {
return dropper?.getDropperX() ?: 0f
}
}
@riggaroo
riggaroo / SpringAnimation.kt
Created March 28, 2019 12:58
Example using SpringAnimation to animate a custom view using FloatPropertyCompat properties.
private fun animateToPoint(point: Point) {
SpringAnimation(this, floatPropertyAnimX, point.x).apply {
spring.stiffness = SpringForce.STIFFNESS_MEDIUM
spring.dampingRatio = SpringForce.DAMPING_RATIO_MEDIUM_BOUNCY
start()
}
SpringAnimation(this, floatPropertyAnimY, point.y).apply {
spring.stiffness = SpringForce.STIFFNESS_MEDIUM
@riggaroo
riggaroo / SpringAnimationVelocity.kt
Created March 28, 2019 13:00
Example setting start velocity of a spring animation.
SpringAnimation(this, floatPropertyAnimY, point.y).apply {
setStartVelocity(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5000f, resources.displayMetrics))
start()
}
@riggaroo
riggaroo / InlineClasses.kt
Last active March 2, 2020 06:04
Have you heard about inline classes in Kotlin?
// Why use inline classes? 🤔
// 🎯 Compile time safety
// 🎯 Less runtime overhead than a normal wrapper class as it "inlines" the data into its usages
// More info : https://kotlinlang.org/docs/reference/inline-classes.html
// Without inline classes 😞
data class Recipe(id: UUID)
data class Ingredient(id: UUID, recipeId: UUID)