Canvas屏保動畫

来源:https://www.cnblogs.com/leitong/archive/2018/08/14/9476041.html
-Advertisement-
Play Games

話不多說直接上代碼 因為項目需求,該動畫中需要顯示即時更新的數據,所以和普通的canvas畫出來的不一樣。但是又不能直接把html畫到canvas中去,彆著急有辦法。 為了繪製 HTML 內容,你要先用<foreignObject> 元素包含 HTML 內容,然後再將這個 SVG 圖像繪製到你的 c ...


話不多說直接上代碼

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body style="height:760px">
<canvas id="canvas" style="border:0px red solid;display:none">
</canvas>
</body>
</html>

因為項目需求,該動畫中需要顯示即時更新的數據,所以和普通的canvas畫出來的不一樣。但是又不能直接把html畫到canvas中去,彆著急有辦法。

為了繪製 HTML 內容,你要先用<foreignObject> 元素包含 HTML 內容,然後再將這個 SVG 圖像繪製到你的 canvas 中。

 

誇張地說,這裡唯一真正棘手的事情就是創建 SVG 圖像。您需要做的所有事情是創建一個包含XML 字元串的 SVG,然後根據下麵的幾部分構造一個 Blob

  1. blob 對象的 MIME 應為 "image/svg+xml"。
  2. 一個 <svg> 元素。
  3. 在 SVG 元素中包含的 <foreignObject> 元素。
  4. 包裹到 <foreignObject> 中的(格式化好的) HTML。

如上所述,通過使用一個 object URL,我們可以內聯 HTML 而不是從外部源載入它。當然,只要域與原始文檔相同(不跨域),您也可以使用外部源。

  //創建畫布
    var Cans=document.getElementById("canvas");
    var ctx=Cans.getContext("2d");
    //設置全屏畫布
    Cans.width=document.body.offsetWidth;
    Cans.height=document.body.offsetHeight;
    var DOMURL,img,svg,url;
    initimg("AAA");//預設顯示數據,一下代碼參考https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Drawing_DOM_objects_into_a_canvas
    function initimg(data) {
        var data = '<svg xmlns="http://www.w3.org/2000/svg" width="52" height="52">' +
            '<foreignObject width="100%" height="100%">' +
            '<div xmlns="http://www.w3.org/1999/xhtml" style="font-size:12px">' +
            '<div style="width:50px;height:50px;border:1px red solid">' +
            ''+data+'</div>' +
            '</div>' +
            '</foreignObject>' +
            '</svg>';
        DOMURL = window.URL || window.webkitURL || window;
        img = new Image();
        svg = new Blob([data], {type: 'image/svg+xml;charset=utf-8'});
        url = DOMURL.createObjectURL(svg);
        img.src = url;
    }

    //每隔五秒刷新數據,隨機從數組中取(實際情況當然是要從後臺獲取)
    var getdata = setInterval(function () {
        var data=["BBB","CCC","DDD","EEE"]
        initimg(data[Math.floor(Math.random()*8)]);
    },5000)

以下便是控制動畫的顯示位置和觸發動畫及關閉動畫

var raf;
    var arror = [];
    var running = false;
    //繪製圖形
    function createStar() {
        return {
            x: 0,
            y: 0,
            vx: 0.7,
            vy: 0.7,//用來控制移動速度
            draw: function() {
                ctx.drawImage(img, this.x, this.y);
                DOMURL.revokeObjectURL(url);
            }
        }
    }
    //清除
    function clear() {
        ctx.fillStyle = 'rgba(255,255,255,1)';
        ctx.fillRect(0,0,canvas.width,canvas.height);
    }
    //判斷圖形坐標是否超出畫布範圍
    function draw() {
        clear();
        arror.forEach(function(ball, i){
            ball.draw();
            ball.x += ball.vx;
            ball.y += ball.vy;
            if (ball.y + ball.vy+50 > canvas.height || ball.y + ball.vy < 0) {
                ball.vy = -ball.vy;
            }
            if (ball.x + ball.vx+50 > canvas.width || ball.x + ball.vx < 0) {
                ball.vx = -ball.vx;
            }
        });
        raf = window.requestAnimationFrame(draw);
    }
    
    canvas.addEventListener('click',function (e) {
        event.preventDefault();
        window.cancelAnimationFrame(raf);
            if(!running){
                Cans.style.display="none"
                document.onmousemove = document.onkeydown = document.onclick = null;
                clearTimeout(timer);
                clearInterval(getdata);
                clear();
            }else{
                running = false;
                bindevent(1);
            }
    })
    function loadpi() {
        if (!running) {
            raf = window.requestAnimationFrame(draw);
            running = true;
        }
        var ball;
        ball = createStar();
        ball.x = canvas.width/2-25;
        ball.y = canvas.height/2-25;
        arror.push(ball);
        document.onmousemove = document.onkeydown = document.onclick = null;
        clearTimeout(timer);
    }
    var timer;
    function bindevent(it) {
        clearTimeout(timer);
        timer = setTimeout(function () {
            if(it==1){
                raf = window.requestAnimationFrame(draw);
                running = true;
            }else{
                Cans.style.display="block"
                loadpi();
            }
        }, 3000);
    }
    window.onload = document.onmousemove = document.onkeydown = document.onclick = function () {
        bindevent();
    }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 MySQL5.7殺手級新特性:GTID原理與實戰 具體過程如下: 1 準備工作,申請阿裡雲RDS 2 配置從實例 (slave) 3 查看是否開啟了binlog,及使用的日誌格式 4 將主實例數據全量同步到從實例 (最好下載RDS控制台的備份數據,不要mysqldump),詳見恢復雲資料庫My ...
  • 在上篇文章《MySQL表結構變更,不可不知的Metadata Lock》中,我們介紹了MDL引入的背景,及基本概念,從“道”的層面知道了什麼是MDL。下麵就從“術”的層面看看如何定位MDL的相關問題。 在MySQL 5.7中,針對MDL,引入了一張新表performance_schema.metad ...
  • 昨天一臺SQL Server 2008R2的資料庫在凌晨5點多拋出下麵告警信息: The log scan number (620023:3702:1) passed to log scan in database 'xxxx' is not valid. This error may indica... ...
  • 轉載自:iOS多線程全套:線程生命周期,多線程的四種解決方案,線程安全問題,GCD的使用,NSOperation的使用 一、多線程的基本概念 進程:可以理解成一個運行中的應用程式,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎,主要管理資源。 線程:是進程的基本執行單元,一個進程對應多個線 ...
  • 一,效果圖。 二,代碼。 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>html 圖像</title> </head> <body> <!--插入圖像--> <p> An image:<img sr="smiley.gif" ...
  • 作為前端最火的構建工具,是前端自動化工具鏈 最重要的部分 ,使用門檻較高。本系列是筆者自己的學習記錄,比較基礎,希望通過 問題 + 解決方式 的模式,以前端構建中遇到的具體需求為出發點,學習 工具中相應的處理辦法。(本篇中的參數配置及使用方式均基於 ) 一. webpack中的html 對於瀏覽器而 ...
  • 簡單定義:根據不同參數長度來實現讓同一個函數,進行不同處理。 使用: 測試: ...
  • 無意看了這篇 "《jQuery插件開發精品教程,讓你的jQuery提升一個臺階》" 文章,現在做一下總結。 一、jQuery插件的創建可以有三種方法 1.通過$.extend()來擴展jQuery 2.通過$.fn 向jQuery添加新的方法 3.通過$.widget()應用jQuery UI的部件 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...