canvas长宽变化时,画布内容消失

本文探讨了在HTML5 Canvas中调整画布尺寸时导致内容丢失的问题,并提供了两种解决方法:一种是通过getImageData和putImageData来复制画布内容;另一种是创建临时画布进行内容转移。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


   canvas画布,当改变画布的长度或者宽度时,画布的内容会消失:



1.正常显示的canvas

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>canvas</title>
</head>
<body>
<canvas width="200px" height="100px" id="myCanvas"></canvas>
<script type="text/javascript">
  var canvas=document.getElementById("myCanvas"),
          cxt=canvas.getContext("2d");
    cxt.strokeStyle="#ff0000";
    cxt.strokeRect(10,10,50,50);
    //canvas.width="300px";
</script>
</body>
</html>


2.宽度改变时,画布内容消失:

<script type="text/javascript">
  var canvas=document.getElementById("myCanvas"),
          cxt=canvas.getContext("2d");
    cxt.strokeStyle="#ff0000";
    cxt.strokeRect(10,10,50,50);
    canvas.width="300px";
</script>



解决方案1:

把变化之前的画布内容copy一份,然后重新画到画布上。

var canvas=document.getElementById("myCanvas"),
        cxt=canvas.getContext("2d");
  cxt.strokeStyle="#ff0000";
  cxt.strokeRect(10,10,50,50);
  resize('300','100');

function resize(w,h)
{
    var imgData = cxt.getImageData(0,0,canvas.width,canvas.height);
    canvas.width = w;
    canvas.height = h;
    cxt.putImageData(imgData,0,0);
}

解决方案2:

var canvas=document.getElementById("myCanvas"),
        cxt=canvas.getContext("2d");
  cxt.strokeStyle="#ff0000";
  cxt.strokeRect(10,10,50,50);
  resize('300','100');

function resize(w,h)
{
    var nc = document.createElement("canvas");
    nc.width = canvas.width;
    nc.height = canvas.height;
    nc.getContext("2d").drawImage(canvas,0,0);
    canvas.width = w;
    canvas.height = h;
    cxt.drawImage(nc,0,0);
}


### 如何在 Android 中使用 Canvas 绘制具有不同宽度和高度的矩形圆角弧线 要在 Android 的 `Canvas` 上绘制带有圆角的矩形并控制其弧度,可以利用 `Path` 和 `Paint` 类来完成更复杂的绘图操作。以下是具体的方法: 通过创建一个路径 (`Path`) 并结合 `addRoundRect()` 方法,能够精确地定义矩形的边界以及每个角落的圆角半径。这种方法允许设置不同的水平 (x-axis) 和垂直 (y-axis) 圆角半径。 #### 使用 Path 和 addRoundRect() 实现 下面是一个完整的代码示例,展示如何在自定义视图中实现这一功能: ```java import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.RectF; import android.view.View; public class CustomRoundedRectangleView extends View { private Paint paint; private Path path; public CustomRoundedRectangleView(Context context) { super(context); init(); } private void init() { paint = new Paint(Paint.ANTI_ALIAS_FLAG); // 抗锯齿标志位 paint.setColor(Color.BLUE); paint.setStyle(Paint.Style.FILL); path = new Path(); // 创建一个新的路径对象 } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int width = getWidth(); // 获取当前视图的宽度 int height = getHeight(); // 获取当前视图的高度 float[] radii = {20f, 30f, 40f, 50f, 60f, 70f, 80f, 90f}; // 定义每一边的圆角半径 [top-left-x, top-left-y,...] RectF rect = new RectF(50, 50, width - 50, height - 50); // 设置矩形范围 path.addRoundRect(rect, radii, Path.Direction.CW); // 添加带圆角的矩形到路径中 canvas.drawPath(path, paint); // 将路径绘制到画布上 } } ``` 上述代码展示了如何使用 `Path` 对象中的 `addRoundRect()` 函数[^1] 来构建一个具有特定圆角半径的矩形,并将其渲染至屏幕上的过程。注意这里传入了一个浮点数组作为参数之一,它指定了各个顶点处 X 轴方向与 Y 轴方向的具体曲率数值。 对于简单的场景下如果只需要统一大小的四周边缘,则可以直接调用如下形式简化版API: ```java canvas.drawRoundRect(new RectF(left,top,right,bottom),radius,radius,paint); // 或者当您已经有一个预先存在的矩形实例rect, path.addRoundRect(rect,singleRadiusForAllCorners,singleRadiusForAllCorners,Direction.CW); ``` 以上方式适用于快速原型开发阶段或者需求较为单一的应用场合][^[^23]. 另外值得注意的是,在实际项目里可能还需要考虑性能优化问题比如减少不必要的重新计算逻辑等;同也要记得处理好各种异常情况下的表现行为以提高用户体验满意度[^4].
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值