QML实现圆环颜色选择器

前端之家收集整理的这篇文章主要介绍了QML实现圆环颜色选择器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本文实例为大家分享了QML实现圆环颜色选择器的具体代码,供大家参考,具体内容如下

话不多说,先上效果图:

QML实现圆环颜色选择器

ColorSelector组件代码如下,有问题可以留言:

  1. import QtQuick 2.0
  2. import QtQuick.Controls 2.2
  3. Item {
  4. id:baseItem
  5. width: 350
  6. height: width
  7. signal colorChanged(string newColor);
  8. property int circleWidth: 40;//圆环宽度
  9. property var curColor: undefined;
  10.  
  11. Rectangle {
  12. id: control
  13. width: baseItem.width
  14. height: width
  15. color: "transparent"
  16. border.width: 1
  17. border.color: "black"
  18. anchors.margins: 10
  19.  
  20. // 根据角度获取颜色值
  21. function getAngleColor(angle) {
  22. var color,d;
  23. if (angle < Math.PI * 2 / 5) { // angle: 0-72
  24. d = 255 / (Math.PI * 2 / 5) * angle;
  25. color = '255,' + Math.round(d) + ',0'; // color: 255,0 - 255,255,0
  26. } else if (angle < Math.PI * 4 / 5) { // angle: 72-144
  27. d = 255 / (Math.PI * 2 / 5) * (angle - Math.PI * 2 / 5);
  28. color = (255 - Math.round(d)) + ',0 - 0,0
  29. } else if (angle < Math.PI * 6 / 5) { // angle: 144-216
  30. d = 255 / (Math.PI * 2 / 5) * (angle - Math.PI * 4 / 5);
  31. color = '0,' + Math.round(d); // color: 0,255
  32. } else if (angle < Math.PI * 8 / 5) { // angle: 216-288
  33. d = 255 / (Math.PI * 2 / 5) * (angle - Math.PI * 6 / 5);
  34. color = '0,'+(255 - Math.round(d)) + ',255'; // color: 0,255 - 0,255
  35. } else { // angle: 288-360
  36. d = 255 / (Math.PI * 2 / 5) * (angle - Math.PI * 8 / 5);
  37. color = Math.round(d) + ',' + (255 - Math.round(d)) ; // color: 0,255 - 255,0
  38. }
  39. return color;
  40. }
  41.  
  42. // 获取旋转角度
  43. function getRotateAngle (mouseX,mouseY) {
  44. var yPosOffset = mouseY - control.width/2; // 计算角度 : tan(x) = (y2-y1)/(x2-x1);
  45. var xPosOffset = mouseX - control.height/2;
  46. // 旋转的弧度 hudu,角度angle
  47. var hudu = 0,angle = 0;
  48. if (xPosOffset != 0 && yPosOffset != 0) {
  49. hudu = Math.atan(Math.abs(yPosOffset / xPosOffset));
  50. }
  51.  
  52. if (xPosOffset === 0 && yPosOffset === 0) {
  53. return angle;
  54. } else if (xPosOffset < 0 && yPosOffset < 0) {
  55. angle = hudu * 180 / Math.PI; // 左上
  56. } else if (xPosOffset === 0 && yPosOffset < 0) {
  57. angle = 90; // 上 中间
  58. } else if (xPosOffset > 0 && yPosOffset < 0) {
  59. angle = 180 - hudu * 180 / Math.PI; // 右上
  60. } else if (xPosOffset > 0 && yPosOffset === 0) {
  61. angle = 180; // 上 下 中间
  62. } else if (xPosOffset > 0 && yPosOffset > 0) {
  63. angle = 180 + hudu * 180 / Math.PI; // 右下
  64. } else if (xPosOffset === 0 && yPosOffset > 0) {
  65. angle = 270; // 下 中间
  66. } else if (xPosOffset < 0 && yPosOffset > 0) {
  67. angle = 360 - hudu * 180 / Math.PI; // 左下
  68. }
  69. return angle;
  70. }
  71.  
  72. // 通过鼠标所在点更新Canvas画图信息
  73. function updateCanvasByMousePos(x,y){
  74. var currentAngle = control.getRotateAngle(x,y);
  75. console.log(x,y,currentAngle);
  76. updateCanvasByAngle(currentAngle);
  77. }
  78.  
  79. //通过角度更新Canvas画图信息位置
  80. function updateCanvasByAngle(angle){
  81. var newX = control.width/2 + - Math.cos(angle*Math.PI/180) * (control.width/2-baseItem.circleWidth/2-2*control.anchors.margins);
  82. var newY = control.height/2 - Math.sin(angle* Math.PI/180) * (control.height/2-baseItem.circleWidth/2-2*control.anchors.margins);
  83.  
  84. console.log("new : ",newX,newY,"\ncur color is :" + baseItem.curColor);
  85. handle.xDrawPos = newX;
  86. handle.yDrawPos = newY;
  87. handle.requestPaint();
  88.  
  89. baseItem.curColor='rgb('+control.getAngleColor(((angle+180)%360)/180 * Math.PI)+')';
  90. baseItem.colorChanged(baseItem.curColor);//发信号
  91. }
  92.  
  93. // 鼠标选择圆环按钮
  94. Canvas {
  95. id:handle
  96. width : parent.width;
  97. height : width
  98.  
  99. property int xDrawPos: 0
  100. property int yDrawPos: 0
  101.  
  102. onPaint: {
  103. var ctx = getContext("2d")
  104. ctx.clearRect(0,width,height);
  105. ctx.beginPath();
  106. ctx.arc(xDrawPos,yDrawPos,baseItem.circleWidth/2 + 10,2 * Math.PI,false);
  107. ctx.fillStyle = 'lightblue';
  108. ctx.fill();
  109. ctx.strokeStyle = 'transparent';
  110. ctx.stroke();
  111. ctx.closePath();
  112.  
  113. ctx.beginPath();
  114. ctx.arc(xDrawPos,baseItem.circleWidth/2 - 2,false);
  115. ctx.fillStyle = baseItem.curColor;
  116. ctx.fill();
  117. ctx.strokeStyle = 'transparent';
  118. ctx.stroke();
  119. ctx.closePath();
  120. }
  121.  
  122. z:1000
  123. }
  124.  
  125. // 圆环画布
  126. Canvas {
  127. id: canvas
  128. width: parent.width-4*control.anchors.margins;
  129. height: parent.height
  130. anchors.centerIn: parent
  131.  
  132. onPaint: {
  133. var ctx = getContext("2d")
  134. var iSectors = 360;
  135. var iSectorAngle = (360/iSectors)/180 * Math.PI; // in radians
  136. ctx.translate(width/2,height/2);
  137. for (var i = 0; i< iSectors; i++) {
  138. var startAngle = 0;
  139. var endAngle = startAngle + iSectorAngle;
  140. var radius = (width/2-1);
  141. var color = control.getAngleColor(iSectorAngle * i);
  142. ctx.beginPath();
  143. ctx.moveTo(0,0);
  144. ctx.arc(0,radius,startAngle,endAngle,false);
  145. ctx.closePath();
  146. ctx.strokeStyle = 'rgb('+color+')';
  147. ctx.stroke();
  148. ctx.fillStyle = 'rgb('+color+')';
  149. ctx.fill();
  150. ctx.rotate(iSectorAngle);
  151. }
  152. ctx.restore();
  153.  
  154. ctx.save();
  155. ctx.translate(0,0);
  156. ctx.beginPath();
  157. ctx.arc(0,width/2-baseItem.circleWidth,false);
  158. ctx.fillStyle = 'white';
  159. ctx.fill();
  160. ctx.strokeStyle = 'transparent';
  161. ctx.stroke();
  162. ctx.restore();
  163. }
  164.  
  165. MouseArea {
  166. id:colorSelectorMouseArea
  167. anchors.fill: parent;
  168. onMouseXChanged: {
  169. control.updateCanvasByMousePos(mouseX,mouseY);
  170. }
  171. }
  172.  
  173. Component.onCompleted:{
  174. control.updateCanvasByAngle(0);
  175. }
  176. }
  177. }
  178. }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

猜你在找的JavaScript相关文章