首页 > 其他分享 >Typescript:计算线性渐变任意比例颜色值

Typescript:计算线性渐变任意比例颜色值

时间:2022-08-23 15:58:19浏览次数:72  
标签:canvas Typescript van 16 渐变 number var 线性 const

需求:

     这两天打算画一个环形进度条,进度从0到100%采用渐变颜色,涉及到各线段颜色取值变化,如果在CSS中,我们可以用linear-gradient达到目的。但遗憾的是,这里用的是ts,需要对每一线段进行赋值,找了半天发现没有这种现成的函数,自己写一个好了。

 实现:

//startColor、endColor线性渐变开始结束颜色,progress比例
function CalcColor(startColor: String, endColor: String, progress: number) :string{
  const startRed: number = parseInt(startColor.substring(1, 3), 16);
  const endRed: number = parseInt(endColor.substring(1, 3), 16);
  //计算红色
  const red: number = Math.floor(endRed + (startRed - endRed) * progress);

  const startGreen: number = parseInt(startColor.substring(3, 5), 16);
  const endGreen: number = parseInt(endColor.substring(3, 5), 16);
  //计算绿色
  const Green: number = Math.floor( endGreen + (startGreen - endGreen) * progress);

  const startBlue: number = parseInt(startColor.substring(5), 16);
  const endBlue: number = parseInt(endColor.substring(5), 16);
  //计算蓝色
  const Blue: number = Math.floor(endBlue + (startBlue - endBlue) * progress);
  
  //拼接成颜色代码
  const result = "#" + red.toString(16).padStart(2,"0") + Green.toString(16).padStart(2,"0") + Blue.toString(16).padStart(2,"0");
  console.log(result);
  //debugger;
  return result;
}

根据绘制的角度计算颜色,赋值即可~

接下来是画圆圈

onMounted(() => {
  const canvas: HTMLCanvasElement = document.getElementById(
    "myCanvas"
  ) as HTMLCanvasElement;
  if (canvas && canvas.getContext != null) {
    var van = canvas.getContext("2d")!;

    drawRing();

    function drawRing() {
      // 清除矩形内所有内容
      van.clearRect(0, 0, canvas.width, canvas.height);
      var i: number;
      var radiusInner: number = 100;
      var radiusOuter: number = 105;
      var offSetX: number = 110;
      var offSetY: number = 110;
      for (i = 0; i < 360; i += 10) {
        van.beginPath();
        //设置线宽
        van.lineWidth = 10;
        van.lineCap = "round";

        // 设置画笔颜色
        van.strokeStyle = CalcColor("#FA6400", "#FEDB65", i / 360);
        //计算绘制线段起始位置
        var startPoint = CalcCoordinate(i, radiusInner, offSetX, offSetY);
        //计算绘制线段结束位置
        var endPoint = CalcCoordinate(i, radiusOuter, offSetX, offSetY);
        //绘制线段
        van.moveTo(startPoint.x, startPoint.y);
        van.lineTo(endPoint.x, endPoint.y);
        // 执行绘制
        van.stroke();
        // 关闭此次绘制
        van.closePath();
      }
    }
  } else {
    console.log("Canvas为空");
    alert("不支持");
  }
});

计算绘制起始位置函数

 

//计算坐标
function CalcCoordinate(angle: number, radius: number, offSetX: number, offSetY: number) {
  var hudu = (Math.PI / 180) * angle;
  const x: number = radius * Math.sin(hudu) + offSetX;
  const y: number = radius * Math.cos(hudu) + offSetY;
  return { x: x, y: y };
}

 

HTML部分,也是有坑

<template>
  <canvas id="myCanvas" width="280" height="280"></canvas>
</template>
<style scoped>
#myCanvas {
  width: 280px;
  height: 280px;
}
</style>

 虽然我在#myCanvas设置了长宽度,但是canvas这个标签长宽并未生效,必须设置它的属性width和height才行,不然你绘制的图形都是变形。刚碰到这个问题挺郁闷的~~

 

总结:

  实现圆形进度条的时候,想倒是蛮简单的,但是代码实现时,却处处碰壁,看来要想做全栈,还有一段路要走,呜呼~

标签:canvas,Typescript,van,16,渐变,number,var,线性,const
From: https://www.cnblogs.com/iDream2018/p/16616527.html

相关文章

  • 线性表
    线性表(线性存储结构)是什么线性表又称线性存储结构,是最简单的一种存储结构,专门用来存储逻辑关系为“一对一”的数据。在一个数据集中,如果每个数据的左侧都有且仅有一个数......
  • 线性代数 | Jordan 标准型的笔记
    内容概述:把方阵A的特征多项式\(c(λ)=|λE-A|\)展开成\(c(λ)=\sum_ia_i\lambda^i\)的形式,然后使用神乎其技的证明,得到\(c(A)=O\),特征多项式是A的化零多项式。......
  • TypeScript 数组中查找最小、最大n个元素
    TypeScript数组中查找最小、最大n个元素 vartypeArr:number[]=[1,10,50,6,80,9,100]; //最小元素privateminArr(arr:number[]){    letminArray:numb......
  • 线性代数 | 三个二次型题目
    目录1一种套路,见过就会做了2反证法是万能的3二次型(实对称矩阵)的标准型,即为相似的对角阵1一种套路,见过就会做了题意:设AB是n阶实对称矩阵,且A是正定矩阵,证明存......
  • [TypeScript] Labelled tuple type
    Let'sseetheunlabelledtupletype:typeAddress=[number,string,string,number,]functionprintAddress(...address:Address){console.log(add......
  • 直播平台怎么搭建,uniapp 字体图标设置渐变色
    直播平台怎么搭建,uniapp字体图标设置渐变色css:.fund-icon{   font-size:41rpx*2;//控制图标大小   margin-top:105rpx*2;   margin-bottom......
  • [神经网络]线性回归
    引言有时候,可以用线性模型模拟数据的分布情况。比如房价与面积之间的关系。示例假设价格只取决于房屋状况的两个因素,即面积(平方米)和房龄(年)。有了这个函数之后,我们要考......
  • 线性代数 | 记两个特征值/特征向量证明题
    目录1从方阵的秩,到\(|λE-A|=0\),再到\((λE-A)x=0\)基础解系2反证法证明线性无关,矩阵相似的传递性1从方阵的秩,到\(|λE-A|=0\),再到\((λE-A)x=0\)基础解系题意:......
  • 【视频】什么是非线性模型与R语言多项式回归、局部平滑样条、 广义相加GAM分析工资数
    全文链接:http://tecdat.cn/?p=9706原文出处:拓端数据部落公众号在这文中,我将介绍非线性回归的基础知识。非线性回归是一种对因变量和一组自变量之间的非线性关系进行建模......
  • 给 TypeScript 回调函数定义接口
    回调函数定义接口就目前我所知道的有两种方式,第一个就是直接声明一个interface,第二个就是直接在函数的回调函数参数写类型。(1)第一种:定义接口,回调函数直接使用接口interf......