html 自动适应手机屏幕大小,HTML5 canvas自适应手机屏幕大小的一种解决方案

一、最终效果

为了不浪费大家时间,先展示最终效果,看看是不是大家需要的解决方案:

标准分辨率:

9664dc47d7aa24bac36de77c2f77a6d6.png

其他分辨率的适配情况:

7ab5c1af6deafc35899936d16ee0c000.png

47766256f8f5bb2dea4ed5e992b61baa.png

二、需求

1.canvas的内容能全部展示在屏幕上

2.尽量能保证图像不变形

3.绘制的文字也能自适应

三、解决方案

1.我们需要指定一个标准分辨率gameW和gameH

2.我们需要获取屏幕的实际分辨率:

screenW=document.documentElement.clientWidth

screenH=document.documentElement.clientHeight

3.把canvas的宽高设置为屏幕一样大

4.计算屏幕宽度与标准宽度的比值:

kW=screenW/gameW

5.适配之后的绘图区高度可能小于屏幕高度,所以会出现黑边。那么我们需要计算黑边的高度:

dY = (screenH - gameH * kW) / 2;    //黑色区域的高度(紫色区域顶部与屏幕顶部的距离)

注意,当dY小于0时,绘图区会超出屏幕范围,这时就需要压缩绘图区高度(这时,画面会有所变形,也是不可避免的事):

//我们先根据宽度比例适配

let dY = (screenH - gameH * kW) / 2; //黑色区域的高度(紫色区域顶部与屏幕顶部的距离)

//当dY小于0时,我们不得不把画面给纵向压缩了。不然部分内容就会到屏幕外面去了

if (dY<0){

dY=0;

kH=screenH/gameH;

}

let scaleH = kW; //高度缩放率,默认以宽度比例

if (kH!==1){

scaleH=kH;

}

最后,还有一个重要的问题,字体大小的自适应。我想到的最简单的方法就是使用双缓冲机制,我们绘图、绘制文字都在另一个缓冲canvas上进行,最后根据scaleH进行缩放,把缓冲canvas的内容绘制到屏幕canvas上。

四、完整代码

核心代码:

let canvas = document.getElementById("main");

let ctx = canvas.getContext("2d");

let screenW = document.documentElement.clientWidth; //屏幕宽度

let screenH = document.documentElement.clientHeight; //屏幕高度

let gameW = 640, gameH = 1280; //标准分辨率,也就是你开发时的分辨率 TODO:这里可以自行修改

let kW = screenW / gameW; //屏幕宽度与标准宽度的比值

let kH = 1; //屏幕高度与标准高度的比值

//我们先根据宽度比例适配

let dY = (screenH - gameH * kW) / 2; //黑色区域的高度(紫色区域顶部与屏幕顶部的距离)

//当dY小于0时,我们不得不把画面给纵向压缩了。不然部分内容就会到屏幕外面去了

if (dY < 0) {

dY = 0;

kH = screenH / gameH;

}

let scaleH = kW; //高度缩放率,默认以宽度比例

if (kH !== 1) {

scaleH = kH;

}

//设置canvas的绝对大小与屏幕一致

canvas.width = screenW;

canvas.height = screenH;

//缓冲区

let canvasBuffer = document.createElement("canvas");

let ctxBuffer = canvasBuffer.getContext("2d");

//缓冲区使用标准分辨率

canvasBuffer.width = gameW;

canvasBuffer.height = gameH;

let timer = setInterval(mainLoop, 32); //60FPS

let testImg = NewImage('./test.png', 200, 250); //测试图片

//游戏主循环

function mainLoop() {

drawFillRect(ctx, '#000', 0, 0, canvas.width, canvas.height); //给canvas刷上一层黑色背景~

drawFillRect(ctxBuffer, '#FF00FF', 0, 0, gameW, gameH); //给游戏区域刷上一层紫色背景~

drawText(ctxBuffer, '#FFF', 25, '窗口width:' + screenW, 0, 0);

drawText(ctxBuffer, '#FFF', 25, '窗口height:' + screenH, 0, 30);

drawText(ctxBuffer, '#FFF', 25, 'kW:' + kW, 0, 60);

drawText(ctxBuffer, '#FFF', 25, 'kH:' + kH, 0, 90);

drawText(ctxBuffer, '#FFF', 25, 'dY:' + dY, 0, 120);

drawSrcImg(ctxBuffer, testImg, 100, 100);

drawText(ctxBuffer, '#000', 32, '柳逐霓', 150, 350);

drawSrcImg(ctxBuffer, testImg, 270, 100);

drawText(ctxBuffer, '#000', 32, '柳逐霓', 320, 350);

drawSrcImg(ctxBuffer, testImg, 530, 100);

drawText(ctxBuffer, '#000', 32, '柳逐霓', 580, 350);

drawSrcImg(ctxBuffer, testImg, 100, 400);

drawText(ctxBuffer, '#000', 32, '柳逐霓', 150, 650);

drawSrcImg(ctxBuffer, testImg, 100, 700);

drawText(ctxBuffer, '#000', 32, '柳逐霓', 150, 950);

drawSrcImg(ctxBuffer, testImg, 100, 1000);

drawText(ctxBuffer, '#000', 32, '柳逐霓', 150, 1250);

//双缓冲

ctx.drawImage(canvasBuffer, 0, 0, gameW, gameH, 0, dY, screenW, gameH * scaleH);

}

18fb30a80f743546aeb9299362949fef.png

4a668feaa3018a2e1706f07e5002bcc8.png

狡猾的皮球

发布了40 篇原创文章 · 获赞 99 · 访问量 12万+

私信

关注

标签:canvas,drawText,let,HTML5,dY,ctxBuffer,屏幕

来源: https://blog.csdn.net/qq_39687901/article/details/104071957

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532193.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编写一个能够排序的函数模板。_LeetCode刷题——9.给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合...

难度(medium)题目描述&#xff1a;给出n对括号&#xff0c;请编写一个函数来生成所有的由n对括号组成的合法组合。例如n3&#xff0c;解集为&#xff1a; "((()))", "(()())", "(())()", "()(())", "()()()" 思路&#xf…

html5怎么产生手风琴效果,Html5 js如何实现手风琴效果

Html5 js如何实现手风琴效果发布时间&#xff1a;2020-08-03 09:54:10来源&#xff1a;亿速云阅读&#xff1a;92作者&#xff1a;小猪这篇文章主要为大家展示了Html5 js如何实现手风琴效果&#xff0c;内容简而易懂&#xff0c;希望大家可以学习一下&#xff0c;学习完之后肯定…

c++进制转换_一文了解进制之间的原理和转换

点击这段文字&#xff1a; 获取2020年&#xff0c;最强Python学习资料进制这块&#xff0c;可以做简单的了解。生活中我们使用的数字都是十进制的&#xff0c;而二进制是机器能够识别的最直接的语言。但是二进制又太大&#xff0c;记录起来非常的不方便。所以通常会将二进制转化…

用HTML做一个简单的web登录页面,简单的JavaWeb注册登录案例

简单的JavaWeb注册登录案例1.注册页面register.htmlregister姓名&#xff1a;电话&#xff1a;邮箱&#xff1a;qq&#xff1a;2.注册案例实现程序register.java/*** 注册案例实现程序* author lucky**/public class register extends HttpServlet {public void doGet(HttpServ…

一层循环时间复杂度_算法的时间与空间复杂度(一看就懂)

算法&#xff08;Algorithm&#xff09;是指用来操作数据、解决程序问题的一组方法。对于同一个问题&#xff0c;使用不同的算法&#xff0c;也许最终得到的结果是一样的&#xff0c;但在过程中消耗的资源和时间却会有很大的区别。那么我们应该如何去衡量不同算法之间的优劣呢&…

用ajax替换html代码,替换Ajax响应一个div的内部HTML(Replace inner HTML of a div w

我试图一些时间间隔后改变一个div的内部HTML。 我得到我想要使用Ajax正确的反应。 但无法取代内HTML的后&#xff0c;并用Ajax响应地选择。 什么是错我的代码..HTML51 seconds ago58 seconds ago.....10 minute agoĴ查询setInterval(function() {$( ".time" ).each(…

java 审批流_一文读懂工作流

网上关于工作流引擎有比较多的简介&#xff0c;也有很多工作流的实际应用场景。本文结合笔者多年对工作流的经验来阐述一下对工作流的理解。一、什么是工作流&#xff1f;先贴上wiki百科对于工作流的定义工作流&#xff08;Workflow&#xff09;&#xff0c;是对工作流程及其各…

postgresql 查询序列_时间序列数据库(TSDB)初识与选择

作者&#xff1a;码哥字节 如需转载联系我的公众号背景 这两年互联网行业掀着一股新风&#xff0c;总是听着各种高大上的新名词。大数据、人工智能、物联网、机器学习、商业智能、智能预警啊等等。以前的系统&#xff0c;做数据可视化&#xff0c;信息管理&#xff0c;流程控制…

concurrenthashmap实现原理_Mybatis:PageHelper分页插件源码及原理剖析

PageHelper是一款好用的开源免费的Mybatis第三方物理分页插件&#xff0c;其实我并不想加上好用两个字&#xff0c;但是为了表扬插件作者开源免费的崇高精神&#xff0c;我毫不犹豫的加上了好用一词作为赞美。原本以为分页插件&#xff0c;应该是很简单的&#xff0c;然而PageH…

计算机网络dst,计算机网络基础课程—Socket接口

什么是TCP/IP------本课程的主要部分TCP/IP如何工作-----TCP/IP软件结构与实现如何用TCP/IP-------TCP/IP应用程序编程接口前面说过&#xff0c;TCP/IP标准并不指定应用程序与TCP/IP协议软件的接口&#xff0c;但并不是说没有提供任何指导&#xff0c;首先&#xff0c;它指定了…

python输入圆的半径公式_[图文]铁路曲线正矢的计算公式

一、圆曲线正矢的计算1.1 圆曲线正矢的计算公式取圆曲线上两点拉一直线,叫做弦。弦上任意点至曲线上的垂直距离叫矢或叫矢距。在弦中央点的矢距叫正矢(下图)。AB一弦;AC、CB一半弦;CD一正矢;EF一矢距正矢计算公式为其中: f-正矢 C-弦长 R-半径 式中单位均为m。公式用文字表示即…

docker 安装nacos_康过来!Nacos配置和管理微服务的使用

Nacos 具有如下特性:服务发现和服务健康监测&#xff1a;支持基于DNS和基于RPC的服务发现&#xff0c;支持对服务的实时的健康检查&#xff0c;阻止向不健康的主机或服务实例发送请求&#xff1b;动态配置服务&#xff1a;动态配置服务可以让您以中心化、外部化和动态化的方式管…

matlab中如何调用gpu进行并行计算_极致安卓-Termux/Aid learning开启WebGL手机GPU并行计算...

在我的之前的测评中&#xff0c;我利用Termux和Aid Learning测试过基于C/C的openmp并行程序&#xff0c;基于Java的并行程序&#xff0c;还有基于MPI以及基于Java的分布式集群并行。但是很遗憾&#xff0c;一直无法成功开发基于OpenCL的GPU并行编程。这是主要是因为Android并没…

python默认编码方式_关于设置python默认编码方式的问题

2019-8-27 07:45:36 本帖最后由 傻纸 于 2019-8-27 10:02 编辑 查了一会资料得出的结论是如果你用的是python3.x&#xff0c;那么就最好别去设置sys.defaultencoding或者sys.stdout.encoding 记住在需要编码的时候用encode&#xff0c;解码的时候decode就可以了。。。 这个问题…

计算机科学与技术是属于什么学科,计算机科学与技术专业属于什么大类 属于哪个学科...

近日&#xff0c;有很多人咨询小编计算机科学与技术专业属于什么大类 属于哪个学科&#xff1f;现在小编统一回复一下大家计算机科学与技术专业属于工学类&#xff0c;下面是关于计算机科学与技术专业详细的介绍。1计算机科学与技术专业门类及学科介绍专业名称专业代码门类学科…

matlab imread_MATLAB图像处理:29:在几何变换输出中指定填充值

本示例说明如何指定imwarp执行几何变换时使用的填充值。执行转换时&#xff0c;输出图像中通常会有一些像素不属于原始输入图像。必须为这些像素分配一些值&#xff0c;称为填充值。默认情况下&#xff0c;imwarp将这些像素设置为零&#xff0c;并显示为黑色。使用FillValues参…

micopython 18b20_MicroPython控制8*8LED点阵显示温度

MicroPython顾名思义就是可以在单片机上跑的Python&#xff0c;借助Micro Python&#xff0c;用户完全可以通过Python脚本语言实现硬件底层的访问和控制&#xff0c;比如说控制LED灯泡、LCD显示器、读取电压、控制电机、访问SD卡等。目前支持MicroPython的开发板有好几种&#…

ip变更会影响账号登陆吗_【教程】PUBG账号被盗导致封禁申诉解封教程

很多朋友询问PUBG在被盗号后被盗号者开挂导致永封该如何申诉解封&#xff0c;现在结合一些玩家被盗号及成功申诉的经历&#xff0c;详列一下步骤。本方法只适用于被盗后开挂导致封禁的账号&#xff0c;那些自己开挂被封的孤儿不用往下看了。一.先向steam客服申诉 找回自己的ste…

滤镜怎么调_手机、电脑怎么剪辑视频?真心求推荐实用工具

自从加入了短视频自媒体运营这个行业以后&#xff0c;我就开始接触到各种各样的手机、电脑视频剪辑、制作软件&#xff0c;用它们来处理、完成被安排到的工作任务。很多时候&#xff0c;我也用它们来剪视频&#xff0c;借此来练练手、积累下素材。记得刚进入这个行业的时候&…

2021计算机基础知识题库,2021~2021计算机基础知识练习题

2021~2021计算机基础知识练习题 2021~2021计算机基础知识练习题 北京联合大学 2021~2021计算机基础知识练习题 一、选择题 1.记录在存储介质上的一组相关信息的集合称为______。 A)程序 B)磁盘 C)软件 D)文件 2.当一个文件更名后&#xff0c;文件的内容会______。 A)完全消失 B…