Canvas知识点之一

1.canvas标签的简单使用


<body>
    <!-- canvas是一个用来展示绘图效果的标签,它和img类似,都是行内块元素 -->
    <!-- 同一个页面可以拥有多个canvas标签 -->
    <!-- 画布默认300*150,要设置画布的宽高,需要借助canvas元素的属性 -->
    <canvas id="cvs" width="600" height="600"></canvas>
    <script>
    var cvs = document.getElementById('cvs');

    /*
     * 上面的canvas只是用来展示绘图效果的,
     * 那么这个图从哪里来的呢?
     * 需要打开canvas(通过getContext方法来打开),然后在上面绘图图形,
     * 最终就可以透过canvas标签看到。
     * */
    var ctx = cvs.getContext('2d');

    /*
     * canvas绘图的几个步骤:
     * 1、先移动钢笔到指定的位置
     * 2、开始画线条
     * 3、描边路径
     * */

    // 1、先移动钢笔到指定的位置
    // ctx.moveTo( x轴移动的坐标,y轴移动的坐标 )
    ctx.moveTo(10, 10);

    // 2、开始画线条
    // ctx.lineTo( x轴移动的坐标,y轴移动的坐标 )
    ctx.lineTo(110, 10);
    ctx.lineTo(110, 110);
    ctx.lineTo(10, 110);
    // 下面这句等价于ctx.closePath();
    ctx.lineTo(10, 10);

    // 颜色设置,必须放在绘制之前
    ctx.strokeStyle = 'blue';
    // 线宽设置,必须放在绘制之前
    ctx.lineWidth = 2;

    // 3、描边路径
    ctx.stroke();
    </script>
</body>

显示效果:为一个蓝色矩形

2.
// 放了防止重绘之前的路径,所以先把之前的路径清除掉
this.ctx.beginPath();

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <canvas id="cvs"></canvas>
    <script>
        var cvs = document.getElementById('cvs');
        var ctx = cvs.getContext('2d');

        // 构造函数
        function MyRect( ctx, startX, startY, width, height, lineWidth, strokeStyle ) {
            this.ctx = ctx;
            this.startX = startX;
            this.startY = startY;
            this.width = width;
            this.height = height;
            this.lineWidth = lineWidth;
            this.strokeStyle = strokeStyle;
        }

        // 给原型添加一个绘制方法
        MyRect.prototype.draw = function() {
            **// 放了防止重绘之前的路径,所以先把之前的路径清除掉
            this.ctx.beginPath();**

            this.ctx.moveTo( this.startX, this.startY );
            this.ctx.lineTo( this.startX + this.width, this.startY );
            this.ctx.lineTo( this.startX + this.width, this.startY + this.height );
            this.ctx.lineTo( this.startX, this.startY + this.height );
            this.ctx.closePath();

            this.ctx.lineWidth = this.lineWidth;
            this.ctx.strokeStyle = this.strokeStyle;

            this.ctx.stroke();
        }

        var myRect = new MyRect( ctx, 10, 10, 60, 60, 4, 'deeppink' );
        myRect.draw();

        var myRect2 = new MyRect( ctx, 100, 10, 100, 100, 6, 'skyblue' );
        myRect2.draw();
    </script>
</body>
</html>

3.非零环绕原则
这个原理其实很简单,发一个链接,大家去看下,Canvas中的非零环绕规则原理
先看这个链接的最后一个例子,画同心圆的时候,用的方法context.arc
的语法:
context.arc(x,y,r,sAngle,eAngle,counterclockwise);
参数 描述
x 圆的中心的 x 坐标。
y 圆的中心的 y 坐标。
r 圆的半径。
sAngle 起始角,以弧度计。(弧的圆形的三点钟位置是 0 度)。
eAngle 结束角,以弧度计。
counterclockwise 可选。规定应该逆时针还是顺时针绘图。
False = 顺时针,true = 逆时针。
这个例子中,outer圆是true逆时针画的,inner圆是false顺时针画的,先在圆的边框上画出对应的箭头,
那么,我们根据非零环绕原则:
这里写图片描述
在从1区域画的线,与其相交的两个曲线,一个顺时针,一个逆时针,结果为0,所以1区域不会被fill(填充)。
再看2区域,只有一条曲线与其相交,逆时针的线,结果为-1,所以2区域会被填充,就是这么easy了。如果画举行,你是怎么样一步一步lineTo,lineTo的就决定了画法的方向。

尝试下画一个中空的矩形吧:

<body>
    <canvas id="cvs"></canvas>
    <script>
    var cvs = document.getElementById('cvs');
    var ctx = cvs.getContext('2d');

    // 封装一个绘制矩形的函数
    function MyRect(startX, startY, width, height, lineWidth, strokeStyle) {

        ctx.moveTo(startX, startY);
        ctx.lineTo(startX + width, startY);
        ctx.lineTo(startX + width, startY + height);
        ctx.lineTo(startX, startY + height);
        ctx.closePath();

        ctx.lineWidth = lineWidth;
        ctx.strokeStyle = strokeStyle;

        ctx.stroke();
    }

    // 顺时针画一个大矩形
    MyRect(10, 10, 100, 100, 6, 'skyblue');


    //这一句不需要了 ctx.beginPath(); 

    // 逆时针画一个小矩形
    ctx.moveTo(35, 35);
    ctx.lineTo(35, 55);
    ctx.lineTo(55, 55);
    ctx.lineTo(55, 35);
    ctx.closePath();

    ctx.lineWidth = 4;
    ctx.strokeStyle = 'blue';
    // 利用非0环绕原则原则
    ctx.fillStyle = 'yellow';
    // 一起填充
    ctx.fill();
    </script>
</body>

4.fill( ) 和 stroke( )方法的调用顺序问题

 在sublime中跑一下就看出区别了
    <script>
        var cvs = document.getElementById('cvs');
        var ctx = cvs.getContext('2d');

        // 封装一个绘制矩形的函数
        function juXing( startX, startY, width, height, lineWidth, strokeStyle, fillStyle ) {
            ctx.moveTo( startX, startY );
            ctx.lineTo( startX + width, startY );
            ctx.lineTo( startX + width, startY + height );
            ctx.lineTo( startX, startY + height );
            ctx.closePath();
            ctx.lineWidth = lineWidth;
            ctx.strokeStyle = strokeStyle;
            ctx.fillStyle = fillStyle;

            ctx.fill();
            ctx.stroke();
        }

        /*
        * 描边的时候,会占用原图形的一部分( 线宽的一半 )。
        * 所以,日常开发中,为了让线宽符合要求,
        * 最好先填充,再描边,防止填充时覆盖掉线宽的一半。
        * */
    </script>

5.线帽样式


<body>
    <canvas id="cvs" width="500" height="500"></canvas>
    <script>
        var cvs = document.getElementById('cvs');
        var ctx = cvs.getContext('2d');

        /*
        * 设置线帽样式:
        * ctx.lineCap = ‘butt' 、'round'、'square'
        * butt是默认值,
        * round线头是圆的,
        * square线头两段各增加线宽的一半。
        * */

        ctx.lineWidth = 10;

        // 默认线头
        ctx.moveTo( 10, 10 );
        ctx.lineTo( 310, 10 );
        ctx.stroke();

        // 增长线头,两端各增长线宽的一半
        ctx.beginPath();
        ctx.lineCap = 'square';
        ctx.moveTo( 10, 30 );
        ctx.lineTo( 310, 30 );
        ctx.stroke();

        // 圆线头,两端的圆半径为线宽的一半
        ctx.beginPath();
        ctx.lineCap = 'round';
        ctx.moveTo( 10, 50 );
        ctx.lineTo( 310, 50 );
        ctx.stroke();
    </script>
</body>

6.线交点样式


<body>
    <canvas id="cvs" width="500" height="500"></canvas>
    <script>
        var cvs = document.getElementById('cvs');
        var ctx = cvs.getContext('2d');

        /*
        * 设置线帽样式:
        * ctx.lineJoin = ‘miter' 、'round'、'bevel'
        * miter是默认值,两边向外延伸相交为尖尖角,
        * round是圆头,
        * bevel两边相连为一个斜面。
        * */

        ctx.lineWidth = 10;

        // 默认交点为尖尖角
        ctx.lineJoin = 'miter';
        ctx.moveTo( 10, 10 );
        ctx.lineTo( 60, 110 );
        ctx.lineTo( 110, 10 );
        ctx.stroke();

        // 交点为圆头
        ctx.beginPath();
        ctx.lineJoin = 'round';
        ctx.moveTo( 10, 50 );
        ctx.lineTo( 60, 150 );
        ctx.lineTo( 110, 50 );
        ctx.stroke();

        // 交点为斜面
        ctx.beginPath();
        ctx.lineJoin = 'bevel';
        ctx.moveTo( 10, 90 );
        ctx.lineTo( 60, 190 );
        ctx.lineTo( 110, 90 );
        ctx.stroke();
    </script>
</body>

7.用清除画布的方法让画布移动起来

<body>
    <canvas id="cvs" width="500" height="500">
    </canvas>
    <script>
    var cvs = document.getElementById('cvs');
    var ctx = cvs.getContext('2d');

    function Rect(ctx, originX, originY, width, height, linewidth, strokestyle) {
        this.ctx = ctx;
        this.originX = originX;
        this.originY = originY;
        this.width = width;
        this.height = height;
        this.linewidth = linewidth;
        this.strokestyle = strokestyle;
    }

    Rect.prototype.draw = function() {
        this.ctx.beginPath();
        this.ctx.moveTo(this.originX, this.originY);
        this.ctx.lineTo(this.originX + this.width, this.originY);
        this.ctx.lineTo(this.originX + this.width, this.originY + this.height);
        this.ctx.lineTo(this.originX, this.originY + this.height);
        this.ctx.closePath();

        this.ctx.lineWidth = this.linewidth;
        this.ctx.strokeStyle = this.strokestyle;
        this.ctx.stroke();
    }

    var rect = new Rect(ctx, 10, 10, 60, 60, 4, 'deeppink');
    rect.draw();

    setInterval(function() {
        // 把画布上的内容都清空
        ctx.clearRect(0, 0, cvs.width, cvs.height);
        rect.originX += 2;
        rect.draw();
    }, 0.5);
    </script>
</body>

8.绘制虚线ctx.setLineDash( )和ctx.lineDashOffset( )

知识点:
   <script>
        /*
        * 数组map方法,es5提供的
        * 语法: 数组.map( function( val, index, arr ) { return 1; } )
        * 返回值:把回调reurn的值共同组成一个数组
        * */

        var arr = [ 1, 2, 3, 4, 5];

        var newArr = arr.map( function( val, index ) {
            return val * 10;
        });
        console.log( newArr );
    </script>


----------


    <canvas id="cvs"></canvas>
    <script>
        var cvs = document.getElementById('cvs');
        var ctx = cvs.getContext('2d');
        /*
        * 设置画线的时候空白部分和实线部分的大小。
        * ctx.setLineDash( [ 5, 3 ] )
        * */
        ctx.lineDashOffset = 3;
        ctx.setLineDash( [ 4, 3, 2 ] );

        ctx.moveTo( 10, 10 );
        ctx.lineTo( 310, 10 );
        ctx.stroke();
        /*
         * 获取线条绘制规则。
         * ctx.getLineDash()
         * */
        console.log(ctx.getLineDash());

        /*
        * 设置虚线绘制时的偏移量
        * ctx.lineDashOffset = 3;
        * */
    </script>

9.画一个坐标轴,画出箭头,画几个点,并连线起来

<body>
    <canvas id="cvs" width="500" height="500"></canvas>
    <script>
        var cvs = document.getElementById('cvs');
        var ctx = cvs.getContext('2d');

        ctx.lineWidth = 2;

        // 坐标轴距离画布上右下左的边距
        var padding = {
            top: 20,
            right: 20,
            bottom: 20,
            left: 20
        }

        // 坐标轴中箭头的宽和高
        var arrow = {
            width: 12,
            height: 20
        }

        // 求坐标轴上顶点的坐标
        var vertexTop = {
            x: padding.left,
            y: padding.top
        }

        // 求坐标轴原点的坐标
        var origin = {
            x: padding.left,
            y: cvs.height - padding.bottom
        }

        // 求坐标轴右顶点的坐标
        var vertexRight = {
            x: cvs.width - padding.right,
            y: cvs.height - padding.bottom
        }


        // 画坐标轴中的两条线
        ctx.moveTo( vertexTop.x, vertexTop.y );
        ctx.lineTo( origin.x, origin.y );
        ctx.lineTo( vertexRight.x, vertexRight.y );
        ctx.stroke();

        // 画上顶点箭头
        ctx.beginPath();
        ctx.moveTo( vertexTop.x, vertexTop.y );
        ctx.lineTo( vertexTop.x - arrow.width / 2, vertexTop.y + arrow.height );
        ctx.lineTo( vertexTop.x, vertexTop.y + arrow.height / 2 );
        ctx.lineTo( vertexTop.x + arrow.width / 2, vertexTop.y + arrow.height );
        ctx.closePath();
        ctx.fill();

        // 画右顶点箭头
        ctx.beginPath();
        ctx.moveTo( vertexRight.x, vertexRight.y );
        ctx.lineTo( vertexRight.x - arrow.height, vertexRight.y - arrow.width / 2 );
        ctx.lineTo( vertexRight.x - arrow.height / 2, vertexRight.y );
        ctx.lineTo( vertexRight.x - arrow.height, vertexRight.y + arrow.width / 2 );
        ctx.closePath();
        ctx.fill();

        /*
        * 在坐标轴中指定位置画点,坐标算法:
        * 点的x轴:原点x坐标 + 点到原点的水平距离
        * 点的y轴:原点y坐标 - 点到原点的垂直距离
        * */

        // 需求,利用折线图的方式展示一下门口大爷酱香饼每日销售量
        // [ 10, 20, 50, 80, 120, 300, 100, 50, 2 ];

        var data = [ 10, 20, 50, 80, 120, 300, 100, 50, 2 ];

        // 画点
        data.forEach( function( val, index ) {
            console.log(val,index);
            ctx.fillRect( origin.x + index * 20 - 2, origin.y - val - 2, 4, 4 );
        });

        // 画折线
        ctx.beginPath();
        data.forEach( function( val, index ) {
            ctx.lineTo( origin.x + index * 20, origin.y - val );
        });
        ctx.stroke();
    </script>
</body>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1章 基础知识 1 1.1 canvas元素 1 1.1.1 canvas元素的大小与绘图表面的大小 4 1.1.2 canvas元素的api 5 1.2 canvas的绘图环境 6 1.2.1 2d绘图环境 6 1.2.2 canvas状态的保存与恢复 8 1.3 本书程序清单的规范格式 9 1.4 开始学习html5 10 1.4.1 规范 10 1.4.2 浏览器 11 1.4.3 控制台与调试器 11 1.4.4 性能 13 1.5 基本的绘制操作 15 1.6 事件处理 18 1.6.1 鼠标事件 18 1.6.2 键盘事件 22 .1.6.3 触摸事件 23 1.7 绘制表面的保存与恢复 23 1.8 在canvas中使用html元素 25 1.9 打印canvas的内容 32 1.10 离屏canvas 35 1.11 基础数学知识简介 37 1.11.1 求解代数方程 37 1.11.2 三角函数 38 1.11.3 向量运算 39 1.11.4 根据计量单位来推导等式 42 1.12 总结 44 第2章 绘制 45 2.1 坐标系统 46 2.2 canvas的绘制模型 47 2.3 矩形的绘制 48 2.4 颜色与透明度 50 2 .5 渐变色与图案 52 2.5.1 渐变色 52 2.5.2 图案 54 2.6 阴影 57 2.7 路径、描边与填充 60 2.7.1 路径与子路径 63 2.7.2 剪纸效果 64 2.8 线段 69 2.8.1 线段与像素边界 70 2.8.2 网格的绘制 71 2.8.3 坐标轴的绘制 72 2.8.4 橡皮筋式的线条绘制 74 2.8.5 虚线的绘制 79 2.8.6 通过扩展canvasrenderingcontext2d来绘制虚线 80 2.8.7 线段端点与连接点的绘制 81 2.9 圆弧与圆形的绘制 83 2.9.1 arc()方法的用法 83 2.9.2 以橡皮筋式辅助线来协助用户画圆 85 2.9.3 arcto()方法的用法 86 2.9.4 刻度仪表盘的绘制 88 2.10 贝塞尔曲线 93 2.10.1 二次方贝塞尔曲线 93 2.10.2 三次方贝塞尔曲线 95 2.11 多边形的绘制 97 2.12 高级路径操作 102 2.12.1 拖动多边形对象 102 2.12.2 编辑贝塞尔曲线 107 2.12.3 自动滚动网页,使某段路径所对应的元素显示在视窗中 115 2.13 坐标变换 116 2.13.1 坐标系的平移、缩放与旋转 116 2.13.2 自定义的坐标变换 119 2.14 图像合成 123 2.15 剪辑区域 128 2.15.1 通过剪辑区域来擦除图像 128 2.15.2 利用剪辑区域来制作伸缩式动画 133 2.16 总结 135 第3章 文本 137 3.1 文本的描边与填充 137 3.2 设置字型属性 141 3.3 文本的定位 144 3.3.1 水平与垂直定位 144 3.3.2 将文本居中 146 3.3.3 文本的度量 147 3.3.4 绘制坐标轴旁边的文本标签 148 3.3.5 绘制数值仪表盘周围的文本标签 151 3.3.6 在圆弧周围绘制文本 152 3.4 实现文本编辑控件 154 3.4.1 指示文本输入位置的光标 154 3.4.2 在canvas中编辑文本 159 3.4.3 文本段的编辑 163 3.5 总结 174 第4章 图像与视频 175 4.1 图像的绘制 176 4.1.1 在canvas之中绘制图像 176 4.1.2 drawimage()方法的用法 177 4.2 图像的缩放 179 4.3 将一个canvas绘制到另一个canvas之中 183 4.4 离屏canvas 186 4.5 操作图像的像素 189 4.5.1 获取图像数据 189 4.5.2 修改图像数据 195 4.6 结合剪辑区域来绘制图像 208 4.7 以图像制作动画 211 4.8 图像绘制的安全问题 216 4.9 性能 216 4.9.1 对比drawimage(htmlimage)、drawimage(htmlcanvas)与putimagedata()的绘图效率 217 4.9.2 在canvas中绘制另一个canvas与绘制普通图像之间的对比;在绘制时缩放图像与保持原样之间的对比 217 4.9.3 遍历图像数据 218 4.10 放大镜 222 4.10.1 使用离屏canvas 224 4.10.2 接受用户从文件系统中拖放进来的图像 225 4.11 视频处理 227 4.11.1 视频格式 227 4.11.2 在canvas中播放视频 229 4.11.3 视频处理 230 4.12 总结 234 第5章 动画 235 5.1 动画循环 235 5.1.1 通过requestanimationframe()方法让浏览器来自行决定帧速率 237 5.1.2 internet explorer浏览器对requestanimationframe()功能的实现 241 5.1.3 可移植于各浏览器平台的动画循环逻辑 241 5.2 帧速率的计算 248 5.3 以不同的帧速率来执行各种任务 249 5.4 恢复动画背景 250 5.4.1 利用剪辑区域来处理动画背景 250 5.4.2 利用图块复制技术来处理动画背景 252 5.5 利用双缓冲技术绘制动画 253 5.6 基于时间的运动 254 5.7 背景的滚动 257 5.8 视差动画 261 5.9 用户手势 264 5.10 定时动画 266 5.10.1 秒表 266 5.10.2 动画计时器 269 5.11 动画制作的最佳指导原则 270 5.12 总结 271 第6章 精灵 272 6.1 精灵概述 273 6.2 精灵绘制器 275 6.2.1 描边与填充绘制器 275 6.2.2 图像绘制器 279 6.2.3 精灵表绘制器 281 6.3 精灵对象的行为 284 6.3.1 将多个行为组合起来 285 6.3.2 限时触发的行为 287 6.4 精灵动画制作器 289 6.5 基于精灵的动画循环 293 6.6 总结 294 第7章 物理效果 295 7.1 重力 295 7.1.1 物体的下落 296 7.1.2 抛射体弹道运动 298 7.1.3 钟摆运动 307 7.2 时间轴扭曲 311 7.3 时间轴扭曲函数 315 7.4 时间轴扭曲运动 317 7.4.1 没有加速度的线性运动 319 7.4.2 逐渐加速的缓入运动 320 7.4.3 逐渐减速的缓出运动 322 7.4.4 缓入缓出运动 323 7.4.5 弹簧运动与弹跳运动 324 7.5 以扭曲后的帧速率播放动画 326 7.6 总结 332 第8章 碰撞检测 333 8.1 外接图形判别法 333 8.1.1 外接矩形判别法 333 8.1.2 外接圆判别法 334 8.2 碰到墙壁即被弹回的小球 336 8.3 光线投射法 337 8.4 分离轴定理(sat)与最小平移向量(mtv) 340 8.4.1 使用分割轴定理检测碰撞 340 8.4.2 根据最小平移向量应对碰撞 362 8.5 总结 373 第9章 游戏开发 374 9.1 游戏引擎 374 9.1.1 游戏循环 376 9.1.2 加载图像 382 9.1.3 同时播放多个声音 384 9.1.4 键盘事件 385 9.1.5 高分榜 386 9.1.6 游戏引擎源代码 387 9.2 游戏原型 395 9.2.1 游戏原型程序的html代码 396 9.2.2 原型程序的游戏循环 399 9.2.3 游戏原型程序的加载画面 400 9.2.4 暂停画面 402 9.2.5 按键监听器 404 9.2.6 游戏结束及高分榜 404 9.3 弹珠台游戏 407 9.3.1 游戏循环弹珠 408 9.3.2 弹珠精灵 410 9.3.3 重力与摩擦力 411 9.3.4 弹板的移动 412 9.3.5 处理键盘事件 413 9.3.6 碰撞检测 416 9.4 总结 425 第10章 自定义控件 426 10.1 圆角矩形控件 427 10.2 进度条控件 433 10.3 滑动条控件 437 10.4 图像查看器控件 446 10.5 总结 454 第11章 移动平台开发 455 11.1 移动设备的视窗 456 11.2 媒体特征查询技术 461 11.2.1 媒体特征查询与css 461 11.2.2 用javascript程序应对媒体特征的变化 462 11.3 触摸事件 464 11.3.1 touchevent对象 464 11.3.2 touchlist对象 465 11.3.3 touch对象 466 11.3.4 同时支持触摸事件与鼠标事件 466 11.3.5 手指缩放 468 11.4 ios5 469 11.4.1 应用程序图标及启动画面 469 11.4.2 利用媒体特征查询技术设置ios5系统的应用程序图标及启动画面 470 11.4.3 以不带浏览器饰件的全屏模式运行应用程序 471 11.4.4 应用程序的状态栏 471 11.5 虚拟键盘 472 11.6 总结 485
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值