color-picker.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. Component({
  2. properties: {
  3. initColor: {
  4. type: String,
  5. value:'rgb(255,0,0)'
  6. },
  7. maskClosable: {
  8. type: Boolean,
  9. value: true
  10. },
  11. mask: {
  12. type: Boolean,
  13. value: true
  14. },
  15. show: {
  16. type: Boolean,
  17. value: false
  18. },
  19. },
  20. data: {
  21. },
  22. lifetimes: {
  23. attached() {
  24. let { initColor} = this.data;
  25. this.setData({
  26. hueColor: this.hsv2rgb((this.rgb2hsv(initColor)).h,100,100)
  27. })
  28. },
  29. ready() {
  30. const $ = this.createSelectorQuery()
  31. const target = $.select('.target')
  32. target.boundingClientRect()
  33. $.exec((res) => {
  34. const rect = res[0]
  35. if (rect) {
  36. this.SV = {
  37. W: rect.width - 28, //block-size=28
  38. H: rect.height - 28,
  39. Step: (rect.width - 28) / 100
  40. }
  41. let { h, s, v } = this.rgb2hsv(this.data.initColor)
  42. // 初始化定位
  43. this.setData({
  44. hsv:{
  45. h,s,v
  46. },
  47. x: Math.round(s * this.SV.Step),
  48. y: Math.round((100-v )* this.SV.Step)
  49. })
  50. }
  51. })
  52. }
  53. },
  54. methods: {
  55. onEnd() {
  56. this.triggerEvent('changeColor', {
  57. color: this.data.colorRes
  58. })
  59. },
  60. changeHue: function (e) {
  61. let hue = e.detail.value;
  62. this.setData({
  63. "hsv.h":hue,
  64. hueColor: this.hsv2rgb(hue, 100, 100),
  65. colorRes: this.hsv2rgb(hue, this.data.hsv.s, this.data.hsv.v)
  66. })
  67. },
  68. changeSV: function (e) {
  69. let {
  70. x,
  71. y
  72. } = e.detail;
  73. x = Math.round(x / this.SV.Step);
  74. y = 100 - Math.round(y / this.SV.Step);
  75. this.setData({
  76. "hsv.s":x,
  77. "hsv.v": y,
  78. colorRes: this.hsv2rgb(this.data.hsv.h, x, y)
  79. })
  80. },
  81. close: function close(e) {
  82. if (this.data.maskClosable) {
  83. this.setData({
  84. show: false
  85. });
  86. this.triggerEvent('close');
  87. }
  88. },
  89. preventdefault:function() {
  90. },
  91. hsv2rgb: function (h, s, v) {
  92. let hsv_h = (h / 360).toFixed(2);
  93. let hsv_s = (s / 100).toFixed(2);
  94. let hsv_v = (v / 100).toFixed(2);
  95. var i = Math.floor(hsv_h * 6);
  96. var f = hsv_h * 6 - i;
  97. var p = hsv_v * (1 - hsv_s);
  98. var q = hsv_v * (1 - f * hsv_s);
  99. var t = hsv_v * (1 - (1 - f) * hsv_s);
  100. var rgb_r = 0,
  101. rgb_g = 0,
  102. rgb_b = 0;
  103. switch (i % 6) {
  104. case 0:
  105. rgb_r = hsv_v;
  106. rgb_g = t;
  107. rgb_b = p;
  108. break;
  109. case 1:
  110. rgb_r = q;
  111. rgb_g = hsv_v;
  112. rgb_b = p;
  113. break;
  114. case 2:
  115. rgb_r = p;
  116. rgb_g = hsv_v;
  117. rgb_b = t;
  118. break;
  119. case 3:
  120. rgb_r = p;
  121. rgb_g = q;
  122. rgb_b = hsv_v;
  123. break;
  124. case 4:
  125. rgb_r = t;
  126. rgb_g = p;
  127. rgb_b = hsv_v;
  128. break;
  129. case 5:
  130. rgb_r = hsv_v, rgb_g = p, rgb_b = q;
  131. break;
  132. }
  133. return 'rgb(' + (Math.floor(rgb_r * 255) + "," + Math.floor(rgb_g * 255) + "," + Math.floor(rgb_b * 255)) + ')';
  134. },
  135. rgb2hsv: function (color) {
  136. let rgb = color.split(',');
  137. let R = parseInt(rgb[0].split('(')[1]);
  138. let G = parseInt(rgb[1]);
  139. let B = parseInt(rgb[2].split(')')[0]);
  140. let hsv_red = R / 255, hsv_green = G / 255, hsv_blue = B / 255;
  141. let hsv_max = Math.max(hsv_red, hsv_green, hsv_blue),
  142. hsv_min = Math.min(hsv_red, hsv_green, hsv_blue);
  143. let hsv_h, hsv_s, hsv_v = hsv_max;
  144. let hsv_d = hsv_max - hsv_min;
  145. hsv_s = hsv_max == 0 ? 0 : hsv_d / hsv_max;
  146. if (hsv_max == hsv_min) hsv_h = 0;
  147. else {
  148. switch (hsv_max) {
  149. case hsv_red:
  150. hsv_h = (hsv_green - hsv_blue) / hsv_d + (hsv_green < hsv_blue ? 6 : 0);
  151. break;
  152. case hsv_green:
  153. hsv_h = (hsv_blue - hsv_red) / hsv_d + 2;
  154. break;
  155. case hsv_blue:
  156. hsv_h = (hsv_red - hsv_green) / hsv_d + 4;
  157. break;
  158. }
  159. hsv_h /= 6;
  160. }
  161. return {
  162. h: (hsv_h * 360).toFixed(),
  163. s: (hsv_s * 100).toFixed(),
  164. v: (hsv_v * 100).toFixed()
  165. }
  166. },
  167. }
  168. })