From fcb0f1fc49e2f82bee73a30dc141339ccd6adeca Mon Sep 17 00:00:00 2001 From: Taras <tarassmakula@gmail.com> Date: Wed, 16 Feb 2022 10:45:47 +0200 Subject: [PATCH] Create circles logo view --- .../futo/circles/extensions/ViewExtensions.kt | 11 ++ .../futo/circles/ui/view/CirclesLogoView.kt | 118 ++++++++++++++++++ 2 files changed, 129 insertions(+) create mode 100644 app/src/main/java/com/futo/circles/extensions/ViewExtensions.kt create mode 100644 app/src/main/java/com/futo/circles/ui/view/CirclesLogoView.kt diff --git a/app/src/main/java/com/futo/circles/extensions/ViewExtensions.kt b/app/src/main/java/com/futo/circles/extensions/ViewExtensions.kt new file mode 100644 index 000000000..4b523b832 --- /dev/null +++ b/app/src/main/java/com/futo/circles/extensions/ViewExtensions.kt @@ -0,0 +1,11 @@ +package com.futo.circles.extensions + +import android.view.View + +fun View.visible() { + visibility = View.VISIBLE +} + +fun View.gone() { + visibility = View.GONE +} \ No newline at end of file diff --git a/app/src/main/java/com/futo/circles/ui/view/CirclesLogoView.kt b/app/src/main/java/com/futo/circles/ui/view/CirclesLogoView.kt new file mode 100644 index 000000000..03943b48d --- /dev/null +++ b/app/src/main/java/com/futo/circles/ui/view/CirclesLogoView.kt @@ -0,0 +1,118 @@ +package com.futo.circles.ui.view + +import android.content.Context +import android.graphics.* +import android.util.AttributeSet +import android.view.View +import androidx.annotation.ColorRes +import androidx.core.content.ContextCompat +import androidx.core.graphics.ColorUtils +import com.futo.circles.R +import kotlin.math.cos +import kotlin.math.min +import kotlin.math.sin +import kotlin.random.Random + +class CirclesLogoView( + context: Context, + attrs: AttributeSet? = null, +) : View(context, attrs) { + + private val sideCirclesCount = 9 + private val defaultScale = 0.5f + + private val colors = listOf( + R.color.green, + R.color.purple, + R.color.yellow, + R.color.orange, + R.color.red, + R.color.pink, + R.color.green, + R.color.orange + ) + + init { + setLayerType(LAYER_TYPE_SOFTWARE, null) + } + + override fun onDraw(canvas: Canvas?) { + super.onDraw(canvas) + val list = createCirclesList() + + list.forEach { canvas?.drawCircle(it.x, it.y, it.radius, it.fillPaint) } + list.forEach{canvas?.drawCircle(it.x, it.y, it.radius, it.borderPaint)} + + } + + + private fun createCirclesList(): List<CircleViewData> { + val radius = min(measuredHeight, measuredWidth) * defaultScale * 0.5f + val center = PointF(0.5f * measuredWidth, 0.5f * measuredHeight) + val circlesList: MutableList<CircleViewData> = mutableListOf() + + circlesList.add( + CircleViewData( + center.x, + center.y, + radius, + getFillPaint(R.color.blue, 0.95f), + getCircleStrokePaint(8f) + ) + ) + + (1..sideCirclesCount).forEach { i -> + circlesList.add(createCircle(center, radius, i)) + } + return circlesList + } + + + private fun createCircle(center: PointF, radius: Float, number: Int): CircleViewData { + val fraction = number.toDouble() / sideCirclesCount + val angle = Math.toRadians(360 * fraction + 27) + val rand = Random.nextDouble(0.5, 1.5).toFloat() + val offset = (1.0f + 0.25f * rand) * radius + val x = center.x + cos(angle).toFloat() * offset + val y = center.y + sin(angle).toFloat() * offset + val scale = 0.85f * rand * defaultScale + val newRadius = scale * radius + + return CircleViewData( + x, + y, + newRadius, + getFillPaint(colors.random(), 0.55f), + getCircleStrokePaint(4f) + ) + } + + private fun getCircleStrokePaint(width: Float) = Paint().apply { + isAntiAlias = true + style = Paint.Style.STROKE + color = Color.BLACK + strokeWidth = width + } + + private fun getFillPaint(@ColorRes fillColorId: Int, opacity: Float): Paint { + val colorWithAlpha = ColorUtils.setAlphaComponent( + ContextCompat.getColor(context, fillColorId), + (255 * opacity).toInt() + ) + + return Paint().apply { + isAntiAlias = true + style = Paint.Style.FILL + color = colorWithAlpha + } + } + +} + +data class CircleViewData( + val x: Float, + val y: Float, + val radius: Float, + val fillPaint: Paint, + val borderPaint: Paint +) \ No newline at end of file -- GitLab