Skip to content

Commit ec91ea7

Browse files
add circle hsv color picker and dialog
1 parent 6487eba commit ec91ea7

File tree

6 files changed

+242
-46
lines changed

6 files changed

+242
-46
lines changed

app/src/main/java/com/smarttoolfactory/composecolorpicker/demo/ColorPickerDemo.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import androidx.compose.ui.Alignment
1212
import androidx.compose.ui.Modifier
1313
import androidx.compose.ui.graphics.Color
1414
import androidx.compose.ui.unit.dp
15+
import com.smarttoolfactory.colorpicker.dialog.ColorPickerCircleHSVDialog
1516
import com.smarttoolfactory.colorpicker.dialog.ColorPickerRingDiamondHSLDialog
1617
import com.smarttoolfactory.colorpicker.dialog.ColorPickerRingRectHSVDialog
1718
import com.smarttoolfactory.colorpicker.widget.ColorDisplayRoundedRect
@@ -91,6 +92,29 @@ fun ColorPickerDemo() {
9192
color = it
9293
}
9394
}
95+
96+
97+
var showColorDialogCircleHSV by remember { mutableStateOf(false) }
98+
99+
OutlinedButton(
100+
modifier = buttonModifier,
101+
onClick = { showColorDialogCircleHSV = !showColorDialogCircleHSV },
102+
colors = ButtonDefaults.outlinedButtonColors(
103+
backgroundColor = Color.Transparent
104+
)
105+
106+
) {
107+
Text(text = "Hue Circle HSV Dialog")
108+
}
109+
110+
if (showColorDialogCircleHSV) {
111+
previousColor = color.copy()
112+
113+
ColorPickerCircleHSVDialog(initialColor = color) {
114+
showColorDialogCircleHSV = !showColorDialogCircleHSV
115+
color = it
116+
}
117+
}
94118
}
95119
}
96120

colorpicker/src/main/java/com/smarttoolfactory/colorpicker/dialog/ColorPickerDialog.kt

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,28 @@ import androidx.compose.foundation.layout.padding
77
import androidx.compose.foundation.shape.RoundedCornerShape
88
import androidx.compose.material.FloatingActionButton
99
import androidx.compose.material.Icon
10+
import androidx.compose.material.Surface
1011
import androidx.compose.material.icons.Icons
1112
import androidx.compose.material.icons.filled.Close
1213
import androidx.compose.runtime.*
1314
import androidx.compose.ui.Alignment
1415
import androidx.compose.ui.Modifier
1516
import androidx.compose.ui.graphics.Color
17+
import androidx.compose.ui.graphics.Shape
18+
import androidx.compose.ui.unit.Dp
1619
import androidx.compose.ui.unit.dp
1720
import androidx.compose.ui.window.Dialog
21+
import com.smarttoolfactory.colorpicker.picker.ColorPickerCircleValueHSV
1822
import com.smarttoolfactory.colorpicker.picker.ColorPickerRingDiamondHSL
1923
import com.smarttoolfactory.colorpicker.picker.ColorPickerRingRectHSV
2024
import com.smarttoolfactory.colorpicker.ui.Blue400
2125

2226
@Composable
23-
fun ColorPickerRingDiamondHSLDialog(initialColor: Color, onDismiss: (Color) -> Unit) {
27+
fun ColorPickerRingDiamondHSLDialog(
28+
initialColor: Color,
29+
selectionRadius: Dp = 8.dp,
30+
onDismiss: (Color) -> Unit
31+
) {
2432

2533
var color by remember { mutableStateOf(initialColor.copy()) }
2634
Dialog(
@@ -29,13 +37,15 @@ fun ColorPickerRingDiamondHSLDialog(initialColor: Color, onDismiss: (Color) -> U
2937
}
3038
) {
3139
Column(horizontalAlignment = Alignment.CenterHorizontally) {
40+
3241
ColorPickerRingDiamondHSL(
3342
modifier = Modifier
3443
.fillMaxWidth()
3544
.weight(1f)
3645
.background(Color(0xcc212121), shape = RoundedCornerShape(5.dp))
3746
.padding(horizontal = 10.dp, vertical = 2.dp),
38-
initialColor = initialColor
47+
initialColor = initialColor,
48+
selectionRadius = selectionRadius
3949
) {
4050
color = it
4151
}
@@ -55,7 +65,11 @@ fun ColorPickerRingDiamondHSLDialog(initialColor: Color, onDismiss: (Color) -> U
5565
}
5666

5767
@Composable
58-
fun ColorPickerRingRectHSVDialog(initialColor: Color, onDismiss: (Color) -> Unit) {
68+
fun ColorPickerRingRectHSVDialog(
69+
initialColor: Color,
70+
selectionRadius: Dp = 8.dp,
71+
onDismiss: (Color) -> Unit
72+
) {
5973

6074
var color by remember { mutableStateOf(initialColor.copy()) }
6175
Dialog(
@@ -70,7 +84,8 @@ fun ColorPickerRingRectHSVDialog(initialColor: Color, onDismiss: (Color) -> Unit
7084
.weight(1f)
7185
.background(Color(0xcc212121), shape = RoundedCornerShape(5.dp))
7286
.padding(horizontal = 10.dp, vertical = 2.dp),
73-
initialColor = initialColor
87+
initialColor = initialColor,
88+
selectionRadius = selectionRadius
7489
) {
7590
color = it
7691
}
@@ -89,5 +104,41 @@ fun ColorPickerRingRectHSVDialog(initialColor: Color, onDismiss: (Color) -> Unit
89104
}
90105
}
91106

107+
@Composable
108+
fun ColorPickerCircleHSVDialog(
109+
modifier: Modifier = Modifier,
110+
initialColor: Color,
111+
selectionRadius: Dp = 8.dp,
112+
dialogBackgroundColor: Color = Color.White,
113+
dialogShape: Shape = RoundedCornerShape(5.dp),
114+
onDismiss: (Color) -> Unit
115+
) {
116+
117+
var color by remember { mutableStateOf(initialColor.copy()) }
118+
119+
Dialog(
120+
onDismissRequest = {
121+
onDismiss(color)
122+
}
123+
) {
124+
Surface(
125+
modifier = modifier,
126+
color = dialogBackgroundColor,
127+
shape = dialogShape,
128+
elevation = 2.dp
129+
) {
130+
ColorPickerCircleValueHSV(
131+
modifier = Modifier
132+
.fillMaxWidth()
133+
.padding(horizontal = 12.dp, vertical = 12.dp),
134+
initialColor = initialColor,
135+
selectionRadius = selectionRadius
136+
) {
137+
color = it
138+
}
139+
}
140+
}
141+
}
142+
92143

93144

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package com.smarttoolfactory.colorpicker.picker
2+
3+
import androidx.compose.foundation.layout.Column
4+
import androidx.compose.foundation.layout.padding
5+
import androidx.compose.runtime.*
6+
import androidx.compose.ui.Alignment
7+
import androidx.compose.ui.Modifier
8+
import androidx.compose.ui.graphics.Color
9+
import androidx.compose.ui.unit.Dp
10+
import androidx.compose.ui.unit.dp
11+
import com.smarttoolfactory.colorpicker.model.ColorModel
12+
import com.smarttoolfactory.colorpicker.selector.HueSaturationSelectorCircleHSV
13+
import com.smarttoolfactory.colorpicker.slider.SliderCircleColorDisplayValueHSV
14+
import com.smarttoolfactory.colorpicker.util.colorToHSV
15+
import com.smarttoolfactory.colorpicker.widget.HexDisplay
16+
17+
/**
18+
*
19+
*/
20+
@Composable
21+
fun ColorPickerCircleValueHSV(
22+
modifier: Modifier = Modifier,
23+
selectionRadius: Dp = 8.dp,
24+
initialColor: Color,
25+
onColorChange: (Color) -> Unit
26+
) {
27+
28+
val hsvArray = colorToHSV(initialColor)
29+
30+
var hue by remember { mutableStateOf(hsvArray[0]) }
31+
var saturation by remember { mutableStateOf(hsvArray[1]) }
32+
var value by remember { mutableStateOf(hsvArray[2]) }
33+
var alpha by remember { mutableStateOf(initialColor.alpha) }
34+
35+
val currentColor =
36+
Color.hsv(hue = hue, saturation = saturation, value = value, alpha = alpha)
37+
38+
var colorModel by remember { mutableStateOf(ColorModel.HSV) }
39+
40+
onColorChange(currentColor)
41+
42+
Column(
43+
modifier = modifier,
44+
horizontalAlignment = Alignment.CenterHorizontally
45+
) {
46+
HueSaturationSelectorCircleHSV(
47+
modifier = Modifier.padding(8.dp),
48+
hue = hue,
49+
saturation = saturation,
50+
selectionRadius = selectionRadius
51+
) { h, s ->
52+
hue = h
53+
saturation = s
54+
55+
}
56+
57+
SliderCircleColorDisplayValueHSV(
58+
modifier = Modifier.padding(8.dp),
59+
hue = hue,
60+
saturation = saturation,
61+
value = value,
62+
alpha = alpha,
63+
onValueChange = {
64+
value = it
65+
},
66+
onAlphaChange = {
67+
alpha = it
68+
}
69+
)
70+
71+
HexDisplay(
72+
color = currentColor,
73+
colorModel = colorModel,
74+
onColorModelChange = {
75+
colorModel = it
76+
}
77+
)
78+
}
79+
}

colorpicker/src/main/java/com/smarttoolfactory/colorpicker/picker/ColorPickerRingDimondHSL.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import com.smarttoolfactory.colorpicker.widget.ColorModelChangeTabRow
3131
* @param ringBackgroundColor background from center to inner radius of [HueSelectorRing].
3232
* @param ringBorderStrokeColor stroke color for drawing borders around inner or outer radius.
3333
* @param ringBorderStrokeWidth stroke width of borders.
34+
* @param selectionRadius radius of white and black circle selector.
3435
* @param onColorChange callback that is triggered when [Color] is changed using [HueSelectorRing],
3536
* [SaturationLightnessSelectorDiamondHSL] or [CompositeSliderPanel]
3637
*/
@@ -43,6 +44,7 @@ fun ColorPickerRingDiamondHSL(
4344
ringBackgroundColor: Color = Color.Black,
4445
ringBorderStrokeColor: Color = Color.Black,
4546
ringBorderStrokeWidth: Dp = 4.dp,
47+
selectionRadius: Dp = 8.dp,
4648
onColorChange: (Color) -> Unit
4749
) {
4850

@@ -88,7 +90,7 @@ fun ColorPickerRingDiamondHSL(
8890
backgroundColor = ringBackgroundColor,
8991
borderStrokeColor = ringBorderStrokeColor,
9092
borderStrokeWidth = ringBorderStrokeWidth,
91-
selectionRadius = 8.dp
93+
selectionRadius = selectionRadius
9294
) { hueChange ->
9395
hue = hueChange
9496
}
@@ -99,7 +101,7 @@ fun ColorPickerRingDiamondHSL(
99101
hue = hue,
100102
saturation = saturation,
101103
lightness = lightness,
102-
selectionRadius = 8.dp
104+
selectionRadius = selectionRadius
103105
) { s, l ->
104106
saturation = s
105107
lightness = l

colorpicker/src/main/java/com/smarttoolfactory/colorpicker/picker/ColorPickerRingRectHSV.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import androidx.compose.ui.unit.dp
1010
import com.smarttoolfactory.colorpicker.model.ColorHSV
1111
import com.smarttoolfactory.colorpicker.model.ColorModel
1212
import com.smarttoolfactory.colorpicker.selector.HueSelectorRing
13-
import com.smarttoolfactory.colorpicker.selector.SaturationLightnessSelectorDiamondHSL
1413
import com.smarttoolfactory.colorpicker.selector.SaturationValueSelectorRectHSV
1514
import com.smarttoolfactory.colorpicker.slider.CompositeSliderPanel
1615
import com.smarttoolfactory.colorpicker.util.colorToHSV
@@ -31,6 +30,7 @@ import com.smarttoolfactory.colorpicker.widget.ColorModelChangeTabRow
3130
* @param ringBackgroundColor background from center to inner radius of [HueSelectorRing].
3231
* @param ringBorderStrokeColor stroke color for drawing borders around inner or outer radius.
3332
* @param ringBorderStrokeWidth stroke width of borders.
33+
* @param selectionRadius radius of white and black circle selector.
3434
* @param onColorChange callback that is triggered when [Color] is changed using [HueSelectorRing],
3535
* [SaturationValueSelectorRectHSV] or [CompositeSliderPanel]
3636
*/
@@ -40,9 +40,10 @@ fun ColorPickerRingRectHSV(
4040
initialColor: Color,
4141
ringOuterRadiusFraction: Float = .9f,
4242
ringInnerRadiusFraction: Float = .6f,
43-
ringBackgroundColor:Color=Color.Transparent,
43+
ringBackgroundColor: Color = Color.Transparent,
4444
ringBorderStrokeColor: Color = Color.Black,
4545
ringBorderStrokeWidth: Dp = 4.dp,
46+
selectionRadius: Dp = 8.dp,
4647
onColorChange: (Color) -> Unit
4748
) {
4849

@@ -88,7 +89,7 @@ fun ColorPickerRingRectHSV(
8889
backgroundColor = ringBackgroundColor,
8990
borderStrokeColor = ringBorderStrokeColor,
9091
borderStrokeWidth = ringBorderStrokeWidth,
91-
selectionRadius = 8.dp,
92+
selectionRadius = selectionRadius,
9293
) { hueChange ->
9394
hue = hueChange
9495
}
@@ -101,7 +102,7 @@ fun ColorPickerRingRectHSV(
101102
hue = hue,
102103
saturation = saturation,
103104
value = value,
104-
selectionRadius = 8.dp
105+
selectionRadius = selectionRadius
105106
) { s, v ->
106107
saturation = s
107108
value = v

0 commit comments

Comments
 (0)