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