精华内容
下载资源
问答
  • Canvas 详解

    2019-08-13 21:28:04
    Canvas 详解 这节我们来看一下 Canvas 的相关知识,官方文档有详细的功能说明,这里我们简要了解一下几个常用的功能 绘制文本、几何图形、位图 接口 功能 drawText 绘制文本 drawLine 绘制连线 drawPath...

    Canvas 详解

    这节我们来看一下 Canvas 的相关知识,官方文档有详细的功能说明,这里我们简要了解一下几个常用的功能

    绘制文本、几何图形、位图

    接口 功能
    drawText 绘制文本
    drawLine 绘制连线
    drawPath 根据给定的Path,绘制连线
    drawPoint 绘制点
    drawBitmap 绘制位图

    位置形状变换

    接口 功能
    translate 平移
    scale 缩放
    rotate 旋转
    skew 倾斜
    clipXXX 切割,参数指定区域内可以继续绘制
    clipOutXXX 切割,参数指定区域内不可以绘制
    setMatrix 通过矩阵实现平移、缩放、旋转等操作

    爆炸粒子效果

    简单实现一个爆炸粒子效果,使用相关功能,先上效果图
    在这里插入图片描述

    最后附上相关代码

    package com.wuba.demo;
    
    import android.animation.ValueAnimator;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.animation.LinearInterpolator;
    
    import java.util.ArrayList;
    
    /**
     * Author silence.
     * Time:2019-08-13.
     * Desc:爆炸粒子动画效果
     */
    public class CustomBoomBallView extends View {
    
        private static final int IDLE = 0;//初始化状态
        private static final int RUNNING = 1;//动画执行状态
    
        private int mAnimStatus = IDLE;
    
        private Paint mPaint;
        private Bitmap mBitmap;//原图
    
        private float mBallDiameter = 3;//粒子直径
        private ArrayList<Ball> mBalls = new ArrayList<>();//保存粒子的集合
    
        private ValueAnimator mAnimator;
    
        public CustomBoomBallView(Context context) {
            this(context, null);
        }
    
        public CustomBoomBallView(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        public CustomBoomBallView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init();
        }
    
        private void init() {
            mPaint = new Paint();
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = 8;
            mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.baybay, options);
            initBalls();
    
            mAnimator = ValueAnimator.ofFloat(0, 1);
            mAnimator.setRepeatCount(-1);
            mAnimator.setDuration(3000);
            mAnimator.setInterpolator(new LinearInterpolator());
            mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    Log.d("tianzhao", "getDuration=" + animation.getCurrentPlayTime());
                    if (animation.getCurrentPlayTime() < 3000){
                        mAnimStatus = RUNNING;
                        updateBall();
                        invalidate();
                    } else {
                        initBalls();
                        invalidate();
                        animation.cancel();
                        mAnimStatus = IDLE;
                    }
    
                }
            });
    
        }
    
        private void initBalls() {
            for (int x = 0; x < mBitmap.getWidth(); x++) {
                for (int y = 0; y < mBitmap.getHeight(); y++) {
                    Ball ball = new Ball();
                    ball.color = mBitmap.getPixel(x, y);
                    ball.x = x * mBallDiameter + mBallDiameter / 2;
                    ball.y = y * mBallDiameter + mBallDiameter / 2;
                    ball.r = mBallDiameter / 2;
    
                    ball.vX = (float) (Math.pow(-1, Math.ceil(Math.random() * 1000)) * 20 * Math.random());
                    ball.vY = rangInt(-15,35);
    
                    ball.aX = 0;
                    ball.aY = 0.98f;
    
                    mBalls.add(ball);
                }
            }
        }
    
        private int rangInt(int i, int j) {
            int max = Math.max(i, j);
            int min = Math.min(i, j);
            return (int) (min + Math.ceil(Math.random() * (max - min)));
        }
    
        /**
         * 更新 ball 的位置和速度
         */
        private void updateBall() {
            for (Ball ball : mBalls) {
                ball.x += ball.vX;
                ball.y += ball.vY;
    
                ball.vX += ball.aX;
                ball.vY += ball.aY;
            }
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            canvas.translate(300, 300);
            for (Ball ball : mBalls) {
                mPaint.setColor(ball.color);
                canvas.drawCircle(ball.x, ball.y, ball.r, mPaint);
            }
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                if (mAnimStatus == IDLE) {
                    mAnimator.start();
                }
            }
            return super.onTouchEvent(event);
        }
    
        /**
         * 粒子相关属性
         */
        private static class Ball {
    
            private int color;//粒子颜色
    
            private float x;//圆心 x 坐标
            private float y;//圆心 y 坐标
            private float r;//粒子半径
    
            private float vX;//水平方向 速度
            private float vY;//垂直方向 速度
            private float aX;//水平方向 加速度
            private float aY;//垂直方向 加速度
        }
    }
    
    
    展开全文
  • Canvas详解

    2019-10-09 11:06:49
    Canvas详解 绘制几何图形,文本,位图等 在指定坐标绘制位图 public void drawBitmap(@NonNull Bitmap bitmap, float left, float top, @Nullable Paint paint) { super.drawBitmap(bitmap, left, top, ...

    Canvas详解

    绘制几何图形,文本,位图等

    1. 在指定坐标绘制位图
    public void drawBitmap(@NonNull Bitmap bitmap, float left, float top, @Nullable Paint paint) {
        super.drawBitmap(bitmap, left, top, paint);
    }
    
    1. 根据给定的起始点和结束点绘制连线
    public void drawLine(float startX, float startY, float stopX, float stopY,
            @NonNull Paint paint) {
        super.drawLine(startX, startY, stopX, stopY, paint);
    }
    
    
    1. 根据指定的path绘制连线
    public void drawPath(@NonNull Path path, @NonNull Paint paint) {
        super.drawPath(path, paint);
    }
    
    
    1. 根据指定的坐标绘制点
    public void drawPoint(float x, float y, @NonNull Paint paint) {
        super.drawPoint(x, y, paint);
    }
    
    
    1. 根据给定的坐标绘制文字
    public void drawText(@NonNull String text, float x, float y, @NonNull Paint paint) {
        super.drawText(text, x, y, paint);
    }
    
    

    绘制位置、形状变换等

    1. 平移操作translate
    canvas.drawRect(0,0,500,500,mPaint);
    canvas.translate(50,50);
    mPaint.setColor(Color.BLUE);
    canvas.drawRect(0,0,500,500,mPaint);
    
    

    在这里插入图片描述

    1. 缩放操作scale
    canvas.drawRect(200,200,700,700,mPaint);
    canvas.scale(0.5f,0.5f);
    mPaint.setColor(Color.BLUE);
    canvas.drawRect(200,200,700,700,mPaint);
    
    

    在这里插入图片描述
    其中四个参数的方法为:

    canvas.drawRect(200,200,700,700,mPaint);
    canvas.scale(0.5f,0.5f,200,200);
    //等同于 在四位参数的源码中为
    //        translate(px, py);
    //        scale(sx, sy);
    //        translate(-px, -py);
    mPaint.setColor(Color.BLUE);
    canvas.drawRect(200,200,700,700,mPaint);
    
    

    在这里插入图片描述
    其中四个参数的方法中,后2个参数进行了位移操作。

    1. 旋转操作rotate
    canvas.drawRect(300,300,600,600,mPaint);
    //rotate旋转默认为从坐标的0,0位置开始的,想在原图形上旋转需要平移坐标原点至原图形位置
    canvas.rotate(45,450,450); px,py为旋转中心位置坐标
    mPaint.setColor(Color.BLUE);
    canvas.drawRect(300,300,600,600,mPaint);
    
    

    在这里插入图片描述

    1. 倾斜操作skew
    canvas.drawRect(0,0,400,400,mPaint);
    //此方法以tan的对边比临边的角度比值进行倾斜
    canvas.skew(1,0); //在x轴方向倾斜45度,y轴逆时针旋转45度
    //canvas.skew(0,1); //在y轴方向倾斜45度,x轴顺时针旋转45度
    mPaint.setColor(Color.BLUE);
    canvas.drawRect(0,0,400,400,mPaint);
    
    

    在这里插入图片描述

    1. 切割操作,参数指定区域内可以继续绘制clipXXX
    canvas.drawRect(200,200,700,700,mPaint);
    mPaint.setColor(Color.BLUE);
    canvas.drawRect(200,800,700,1300,mPaint);
    //画布裁剪的部分,为一个200,200,700,700的矩形部分,只能在这一部分进行绘制,其他部分绘制不显示
    canvas.clipRect(200,200,700,700);
    //超出裁剪区域,无法绘制
    canvas.drawCircle(200,800,100,mPaint);
    //部分在绘制区域,显示部分
    canvas.drawCircle(300,300,300,mPaint);
    //完全在绘制区域,全部显示
    canvas.drawCircle(400,400,100,mPaint);
    

    在这里插入图片描述

    1. 反向切割操作,参数指定区域内不可以继续绘制clipOutXXX
    canvas.drawRect(200, 200, 700, 700, mPaint);
    mPaint.setColor(Color.BLUE);
    canvas.drawRect(200, 800, 700, 1300, mPaint);
    //画布裁剪的部分,为一个200,200,700,700的矩形部分,这一部分不能绘制,只能在这一部分之外的区域进行绘制
    canvas.clipOutRect(200, 200, 700, 700);
    //裁剪区域,无法绘制
    canvas.drawCircle(200, 800, 100, mPaint);
    //部分在裁剪区域,显示部分
    canvas.drawCircle(300, 300, 300, mPaint);
    //完全在绘制区域之外,全部显示
    canvas.drawCircle(400, 400, 100, mPaint);
    

    在这里插入图片描述

    1. 可通过matrix实现平移,缩放,旋转等操作setMatrix
    canvas.drawRect(0,0,500,500,mPaint);
    Matrix matrix = new Matrix();
    //移动
    //matrix.setTranslate(50,50);
    //旋转45度
    matrix.setRotate(45);
    //缩放
    //matrix.setScale(0.5f,0.5f);
    canvas.setMatrix(matrix);
    mPaint.setColor(Color.BLUE);
    canvas.drawRect(0,0,500,500,mPaint);
    
    

    状态保存和恢复

    canvas调用各种translate等变换操作后,后续的操作都是基于变换后的canvas,都会受到影响,对于后续操作不方便。Canvas提供了save,saveLayer,saveLayerAlpha,restore,restoreToCount来保存和恢复状态。

    1. 通过save和restore restoreToCount保存和恢复状态
    canvas.drawRect(0,0,500,500,mPaint);
    //位移后画布移动  保存状态
    canvas.save();
    canvas.translate(50,50);
    mPaint.setColor(Color.BLUE);
    canvas.drawRect(0,0,500,500,mPaint);
    //再次调整画布
    canvas.save();
    canvas.translate(100,100);
    mPaint.setColor(Color.GREEN);
    canvas.drawRect(0,0,500,500,mPaint);
    //调用save时将其存放的栈中,每调用一次restore释放一个save,返回到上一个状态位置
    canvas.restore();
    mPaint.setColor(Color.BLUE);
    canvas.drawLine(0,0,700,700,mPaint);
    //再次释放
    canvas.restore();
    mPaint.setColor(Color.RED);
    canvas.drawLine(0,0,500,900,mPaint);
    

    在这里插入图片描述
    也可以调用restoreToCount返回到指定的画布位置状态

    //调用restoreToCount返回到改保存画布的位置,将此位置之上存在的所有栈全部剔除
    canvas.restoreToCount(saveOne);
    mPaint.setColor(Color.RED);
    canvas.drawLine(0,0,500,900,mPaint);
    

    在这里插入图片描述

    1. 通过离屏绘制进行恢复。即先离屏将其绘制完毕,再将界面添加到画布上(此方法可以指定离屏绘制的画布大小)
    canvas.drawRect(200,200,700,700,mPaint);
    //离屏绘制区域为0,0,700,700的长方形区域 
    int layerId = canvas.saveLayer(0,0,700,700,mPaint);
    mPaint.setColor(Color.BLUE);
    Matrix matrix = new Matrix();
    //画布原点平移100,100
    matrix.setTranslate(100,100);
    canvas.setMatrix(matrix);
    //由于离屏绘制区域为0,0,700,700,且画布平移了100,100,所以新画的矩形0,0,700,700不能完全展示完毕
    canvas.drawRect(0,0,700,700,mPaint);
    //恢复之前的状态
    canvas.restoreToCount(layerId);
    mPaint.setColor(Color.RED);
    canvas.drawRect(0,0,100,100,mPaint);
    

    在这里插入图片描述

    展开全文
  • canvas详解

    2020-02-11 11:50:55
    canvas标签用于图像的绘制的标签 示例: 创建了canvas标签并且设置高和宽 <canvas id="canvas" width="800" height="400"></canvas> 注意 width和heigh也可以用过css设置 getContext()方法返回一个...

    canvas标签用于图像的绘制的标签
    示例:
    创建了canvas标签并且设置高和宽

    <canvas  id="canvas" width="800" height="400"></canvas>
    

    注意 width和heigh也可以用过css设置

    getContext()方法返回一个用于在画布上绘画的环境
    目前参数只能传 2d
    未来可能有3d

    let cttx=canvas.getContext('2d');
    //绘制元素都是基本返回的对象上进行绘制
    

    Canvas坐标

    左上角的0.0
    在这里插入图片描述

    绘制矩形

    fillRect(x,y,width,height); //填充矩形
    strokeRect(x,y,width,height) //绘制矩形边框
    clearRect(x,y,width,height); //清除指定矩形区域
    举栗:

    	let canvas=document.getElementById("canvas");
        let ctx=canvas.getContext('2d');
        ctx.fillRect(5,5,100,100) //在x:5 y:5 画一个100*100的矩形
    

    在这里插入图片描述

    绘制路径

    绘制路径有四个步骤: (类似ps钢笔)
    1.创建起始点
    2.画出路径
    3.路径封闭
    4.填充路径
    这四个步骤并不是一定都要用 看自己需求
    beginPath() 新建一条路径
    closePath() 闭合路径
    stroke() 通过线条来绘制轮廓
    fill() 填充路径
    moveTo(x,y) //线段起始位置
    lineTo(x,y) //线段结束位置
    绘制空心三角形

    let canvas=document.getElementById("canvas");
        let ctx=canvas.getContext('2d');
        ctx.beginPath();
        ctx.moveTo(75,50);  //起始位置 相当于画画时的笔尖
        ctx.lineTo(100,25); //笔移动的位置
        ctx.lineTo(100,75); 
        ctx.lineTo(75,50) //此部可以由closePath()代替
        ctx.closePth();
        ctx.stroke();
    

    在这里插入图片描述

    绘制 圆弧

    arc()方法
    arc(x,y,radius,startAngle,endAngle,anticlockwise)
    x,y 起始坐标
    radius:圆的半径
    startAngle:起始弧度
    endAngle:结束弧度
    anticlockwise:给定方向默认为 顺时针 false为顺时针 true 为逆时针
    这里弧度:
    弧度=(Math.Pi/180)*角度

    画一个圆

     let canvas=document.getElementById("canvas");
        let ctx=canvas.getContext('2d');
        ctx.beginPath();
        ctx.arc(95,40,40,0,2*Math.PI);
        ctx.stroke();
    

    绘制笑脸

    let canvas=document.getElementById("canvas");
        let ctx=canvas.getContext('2d');
        ctx.beginPath();
        //画一个圆
        ctx.arc(75,75,50,0,2*Math.PI,false);
        //移动线的位置
        ctx.moveTo(110,75);
        ctx.arc(75,75,35,0,Math.PI,false);
        ctx.moveTo(65,65);
        ctx.arc(60,65,5,0,Math.PI*2,true);  // 左眼
        ctx.moveTo(95,65);
        ctx.arc(90,65,5,0,Math.PI*2,true);  // 右眼
        ctx.stroke();
    

    在这里插入图片描述

    二次贝塞尔曲线及三次贝塞尔曲线

    quadraticCurveTo(cp1x,cp1y,1,x,y)
    xy:为开始结束点
    cp1x,cp1y为控制点
    对于这些参数怎么填设计到数学问题
    但是我们可以到浏览器中一步步调试

    let canvas=document.getElementById("canvas");
        let ctx=canvas.getContext('2d');
        ctx.beginPath();
        ctx.moveTo(75,75);
        ctx.quadraticCurveTo(25,25,25,65.25)
        ctx.stroke();
    

    在这里插入图片描述

    颜色

    fillStyle=color //填充颜色
    strokeStyle=color //设置图像边框颜色
    绘制一个三角形设置为橘黄色

    let canvas=document.getElementById("canvas");
        let ctx=canvas.getContext('2d');
        ctx.beginPath();
        ctx.fillStyle="orange"
        ctx.moveTo(75,75);
        ctx.lineTo(100,100);
        ctx.lineTo(100,25);
        ctx.closePath();
        ctx.fill();
    

    在这里插入图片描述

    let canvas=document.getElementById("canvas");
        let ctx=canvas.getContext('2d');
        ctx.beginPath();
        ctx.strokeStyle="red"; //设置为红色
        ctx.moveTo(75,75);
        ctx.lineTo(100,100);
        ctx.stroke();
    

    在这里插入图片描述

    透明度Transparency

    globalAlpha=[0-1]
    设置图像的透明度
    另外也可以用过rgba设置透明度
    let ctx.fillStlye=rgba(255,255,255,0.2);

    let canvas=document.getElementById("canvas");
        let ctx=canvas.getContext('2d');
        ctx.beginPath();
        ctx.fillStyle="orange"
        ctx.globalAlpha=0.2; //设置透明度
        ctx.moveTo(75,75);
        ctx.lineTo(100,100);
        ctx.lineTo(100,25);
        ctx.closePath();
        ctx.fill();
    

    在这里插入图片描述

    线条样式

    lineWidth=value;
    设置线条宽度
    lineCap=type
    type有:
    butt
    round
    square
    在这里插入图片描述
    线条末端样式
    lineJoin=type
    线条与线条间接合处的样式

    绘制图像

    drawImage()在画布上绘制图像、或者视频
    在画布上定位图像:
    drawImage(img,x,y)

    let canvas=document.getElementById("canvas");
        let ctx=canvas.getContext('2d');
        let img=new Image();
        img.src="img/bg.jpg";
        img.onload=function(){ //img.onload等图片加载完在画
            ctx.drawImage(img,0,0)
        }
    

    在这里插入图片描述
    在画布上定位图像并且规定图像的宽度和高度
    drawImage(img,x,y,width,height);

    ctx.drawImage(img,0,0,100,100)
    

    在这里插入图片描述
    设置图像并且剪切图像
    drawImage(img,sx,sy,swidth,sheight,x,y,width,height)
    img:使用的图片或者视频
    sx:剪切的x坐标 可选
    sy:剪切的y坐标 可选
    swidth: 剪切宽度 可选
    wheight: 剪切高度 可选
    x: 图片x坐标
    y:图片y坐标
    width:

    参数 描述
    img 使用的图片或者视频
    sx 可选 剪切的x坐标
    sy 可选 剪切的y坐标
    swidth 可选 剪切的宽度
    sheight 可选 剪切的高度
    x 图片的x坐标
    y 图像的y坐标
    width 可选 图像的宽度
    height 可选 图像的高度
    展开全文
  • canvas 详解

    千次阅读 2019-07-18 21:44:24
    canvas 什么是canvas? 是一个可以使用脚本(通常为JavaScript)来绘制图形的 HTML 元素. canvas标签用来绘制图像,本身就是一个画布,没有绘画能力,所有的绘制都是通过js脚本实现的 都能干什么? 可以用于绘制图表...

    在这里插入图片描述

    canvas

    什么是canvas?

    <canvas></canvas> 英 ['kænvəs] 美 ['kænvəs] 帆布 画布
    
    • Canvas 是一个矩形区域的画布,可以用 JavaScript 在上面绘画。控制其每一个像素。
    • canvas 标签使用 JavaScript 在网页上绘制图像,本身不具备绘图功能。
    • canvas 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。
    • HTML5 之前的 web 页面只能用一些固定样式的标签:比如 p、div、h1 等

    canvas标签本身是一个画布,没有绘画能力,所有的绘制都是通过js脚本实现的

    都能干什么?(了解)

    1. 游戏:canvas 在基于 Web 的图像显示方面比 Flash 更加立体、更加精巧,canvas 游戏在流畅度和跨平台方面更牛。
    2. 可视化数据.数据图表话,比如:百度的 echart.js
    3. banner 广告:Flash 曾经辉煌的时代,智能手机还未曾出现。现在以及未来的智能机时代,HTML5 技术能够在 banner 广告上发挥巨大作用,用 Canvas 实现动态的广告效果再合适不过。
    4. 未来=> 模拟器:无论从视觉效果还是核心功能方面来说,模拟器产品可以完全由 JavaScript 来实现。
    5. 未来=> 远程计算机控制:Canvas 可以让开发者更好地实现基于 Web 的数据传输,构建一个完美的可视化控制界面。
    6. 未来=> 图形编辑器:Photoshop 图形编辑器将能够 100%基于 Web 实现。
      其他可嵌入网站的内容(多用于活动页面、特效):类似图表、音频、视频,还有许多元素能够更好地与 Web 融合,并且不需要任何插件。
    我们课程的目标
    • 要求必须会做基本的用 canvas 绘制图形等、各种图表。

    canvas 使用方式:

    <canvas id="cavsElem" width="500" height="500">
      你的浏览器不支持canvas,请升级浏览器.浏览器不支持,显示此行文本
    </canvas>
    

    可以设置 width 和 height 属性,但是属性值单位必须是 px,否则忽略。

    注意:

    • 不要用 CSS 控制它的宽和高,否则会出现画布拉伸情况。
    • 重新设置 canvas 标签的宽高属性会让画布擦除所有的内容。
    • 可以给 canvas 画布设置背景色

    Context:Canvas 的上下文、绘制环境。(重点掌握)

    • 上下文:上知天文,下知地理。是所有的绘制操作 api 的入口或者集合。
    • Canvas 自身无法绘制任何内容。Canvas 的绘图是使用 JavaScript 操作的。
    • Context 对象就是 JavaScript 操作 Canvas 的接口。 *使用[CanvasElement].getContext(‘2d’)来获取 2D 绘图上下文。
    • var canvas = document.getElementById(‘cavsElem’); //获得画布
    • var ctx = canvas.getContext(‘2d’); //注意:2d小写

    基本的绘制路径(重点)

    2.3.1 canvas 坐标系

    canvas 坐标系,从最左上角 0,0 开始。x 向右增大, y 向下增大。
    在这里插入图片描述

    Canvas:更改坐标变换

    translate 方法接受两个参数。x是左右偏移量,y是上下偏移量。当偏移量操作出Canvas的width或height时,坐标将会移出Canvas的画布,这个时候你绘制的东西都将看不到。

    translate(200, 200);
    在这里插入图片描述

    路径开始和闭合

    • 开始路径:ctx.beginPath();
    • 闭合路径:ctx.closePath();
    • 解释:如果是绘制不同状态的线段或者形状,必须使用开始新路径的方法把不同的绘制操作隔开,闭合路径会自动把最后的线头和开始的线头连在一起。
    • beginPath: 核心的作用是将不同绘制的形状进行隔离,
      每次执行此方法,表示重新绘制一个路径,跟之前的绘制的墨迹可以进行分开样式设置和管理。

    设置起点(moveTo)

    • 语法:ctx.moveTo(x, y);
    • 解释:设置绘制路径的起点。
    • 参数:x,y 都是相对于 canvas盒子的最左上角。
    • 注意:绘制线段前必须先设置起点。

    设置过程点(lineTo)

    • 语法:ctx.lineTo(x, y);
    • 解释:从x,y的位置连到一个指定的点。
    • 参数:x,y 线头点坐标。

    描边(stroke)

    • 语法:ctx.stroke();
    • 解释:绘制出通过 moveTo() 和 lineTo() 方法定义的坐标路径。默认色是黑色。
    • stroke: (用笔等)画;轻抚;轻挪;敲击;划尾桨;划掉;(打字时)击打键盘
      英 [strəʊk] 美 [strok]

    描边颜色(strokeStyle) 属性

    • 语法:ctx.strokeStyle = “red”;
    • 解释 :当前线条的颜色。

    填充颜色(fillStyle) 属性

    • 语法:ctx.fillStyle= “red”;
    • 解释 :当前填充的颜色。

    线条的宽度(lineWidth) 属性

    • 语法:ctx.lineWidth= “10”;
    • 解释 :当前线条的宽度,以像素计。

    canvas 绘制的基本步骤:

    1. 获得上下文 => canvasElem.getContext(‘2d’);
    2. 开启路径 =>ctx.beginPath();
    3. 移动起始点 =>ctx.moveTo(x, y);
    4. 绘制线 =>ctx.lineTo(x, y)
    5. 闭合路径 =>ctx.closePath();
    6. 绘制描边 =>ctx.stroke();

    填充(fill)

    • 语法:ctx.fill();
    • 解释:填充,是将闭合的路径的内容填充具体的颜色。默认黑色。

    注意:当你调用fill()函数时,所有没有闭合的形状都会自动闭合,所以你不需要调用closePath()函数。但是调用stroke()时不会自动闭合。

    快速创建矩形 rect()方法

    • 语法:ctx.rect(x, y, width, height);
    • 解释:x, y是矩形左上角坐标, width和height都是以像素计
    • rect方法只是规划了矩形的路径,并没有填充和描边。
    • rect: abbr. 矩形(rectangular);收据(receipt)

    快速创建描边矩形和填充矩形

    • 语法: ctx.strokeRect(x, y, width, height);
      • x, y是矩形左上角坐标, width和height都是以像素计,此方法绘制完路径后立即进行stroke绘制。
    • 语法:ctx.fillRect(x, y, width, height);
      • x, y是矩形左上角坐标, width和height都是以像素计, 此方法执行完成立即对当前矩形进行fill填充。

    清除矩形(clearRect)

    • 语法:ctx.clearRect(x, y, width, height);
    • 解释:清除矩形内的绘制的内容,相当于橡皮擦。

    绘制圆形(arc)

    概述:arc() 方法创建弧/曲线(用于创建圆或部分圆)。

    语法:

    arc(x,y,r,sAngle,eAngle,counterclockwise);

    圆形 arc()
    arc(x, y, radius, Math.PI / 180 * startAngle, Math.PI / 180 * endAngle, anticlockwise);
    x,y 是圆心点的坐标
    x:x坐标
    y:y坐标
    radius:半径
    startAngle:开始角度 (Math.PI / 180 * startAngle = 弧度)
    endAngle:结束角度 (Math.PI / 180 * endAngle = 弧度)
    anticlockwise:旋转方向,默认是falsefalse = 顺时针,true = 逆时针)
    

    绘制文字 font 属性

    • font 设置或返回文本内容的当前字体属性。
      font 属性使用的语法与 CSS font 属性相同。

    例如:ctx.font = “18px ‘微软雅黑’”;

    文本内容对齐方式 textAlign 属性

    textAlign 设置或返回文本内容在当前坐标上的当前对齐方式

    • start : 默认。文本在指定的位置开始。
    • end : 文本在指定的位置结束。
    • center: 文本的中心被放置在指定的位置。
    • left : 文本左对齐。
    • right : 文本右对齐。

    例如:ctx.textAlign = ‘left’;

    在这里插入图片描述

    设置绘制文本时的当前文本基线 textBaseline 属性

    • textBaseline 设置或返回在绘制文本时使用的当前文本基线
    • alphabetic : 默认。文本基线是普通的字母基线。
    • top : 文本基线是 em 方框的顶端。。
    • hanging : 文本基线是悬挂基线。
    • middle : 文本基线是 em 方框的正中。
    • ideographic: 文本基线是 em 基线。
    • bottom : 文本基线是 em 方框的底端。
      在这里插入图片描述

    绘制文本方法

    • ctx.fillText() 在画布上绘制“填充的”文本
    • ctx.strokeText() 在画布上绘制"空心文本(无填充)

    font - 定义字体
    fillText(text,x,y) - 在 canvas 上绘制实心的文本
    strokeText(text,x,y) - 在 canvas 上绘制空心的文本 使用 fillText():

    实例:

      var c = document.getElementById("myCanvas");
      var ctx=c.getContext("2d");
      ctx.font="30px 楷体";
      ctx.fillText("Hello World",10,50);
    

    线条的样式 lineCap 属性

    lineCap 设置或返回线条的俩端样式

    • lineCap 设置线条的结束端样式
    • butt 默认。线条俩端添加平直边缘
    • round 线条俩端添加圆形线帽。
    • square 线条俩端添加正方形线帽

    cxt.lineCap=‘round’;

    绘制图像 (drawImage)

    context.drawImage(img,x,y);

    参数说明: x,y 绘制图片左上角的坐标, img是绘制图片的dom对象。

    实例:

    用 JavaScript 创建 img 对象

    <img src="img/1.jpg" id="scream" />
    <canvas id="myCanvas" width="250" height="300" ></canvas>
    
    <script>
    	var c=document.getElementById("myCanvas");
    	var ctx=c.getContext("2d");
    	var img=document.getElementById("scream");
    	//图片为一个资源请求,在js中加载时,会有一个图片加载的时间。
    //多数情况当图片还没有加载完毕就调用了drawImage,此方法他是不起作用的。
    	img.onload = function () {
    	   ctx.drawImage(img,10,10); //使用
    	}
    </script>
    

    旋转

    rotate(Math.PI/180 * angle);

    旋转角度,以弧度计。

    save()

    保存当前环境的状态
    

    restore()

    返回之前保存过的路径状态和属性
    

    饼图

    公式:(每个扇形值/每个扇形的总和)* 360

    X = Math.cos(角度 * Math.PI / 180) * R;
    Y = Math.sin(角度 * Math.PI / 180) * R ;
    R:半径

    visual studio code : 推荐智能提示使用插件:(canvas-snippets)

    结束语:
    乱世浮萍忍看烽火燃山河,位卑未敢忘忧国。

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,086
精华内容 6,034
关键字:

canvas详解