hidpi-canvas-polyfill.js 多次调用canvas.getContext('2d') 导致画布放大问题

相信做前端的 对hidpi-canvas-polyfill.js  都不陌生;

手机端的高清屏上 用canvas 画图,大部分 都用到了hidpi-canvas-polyfill.js ;

这个包在高清屏上很好用,但在使用时 可能也会遇到一些问题。

我在使用时就遇到一个,和大家分享一下。

(function(prototype) {
	prototype.getContext = (function(_super) {
		return function(type) {
			var backingStore, ratio,
				context = _super.call(this, type);

			if (type === '2d') {

				backingStore = context.backingStorePixelRatio ||
							context.webkitBackingStorePixelRatio ||
							context.mozBackingStorePixelRatio ||
							context.msBackingStorePixelRatio ||
							context.oBackingStorePixelRatio ||
							context.backingStorePixelRatio || 1;

				ratio = (window.devicePixelRatio || 1) / backingStore;

				if (ratio > 1) {
					this.style.height = this.height + 'px';
					this.style.width = this.width + 'px';
					this.width *= ratio;
					this.height *= ratio;
				}
			}

			return context;
		};
	})(prototype.getContext);
})(HTMLCanvasElement.prototype);

这是 hidpi-canvas.js 中的一段代码,

这段代码在我们调用canvas.getContext("2d")时 被执行。当调用一次时一切正常,但调用多次,就会有问题。它会把 canvas 元素放大到原来的 几倍。

解决方案:

(function(prototype) {
	prototype.getContext = (function(_super) {
		return function(type) {
			var backingStore, ratio,
				context = _super.call(this, type);

			if (type === '2d') {

				backingStore = context.backingStorePixelRatio ||
							//context.webkitBackingStorePixelRatio ||
							context.mozBackingStorePixelRatio ||
							context.msBackingStorePixelRatio ||
							context.oBackingStorePixelRatio ||
							context.backingStorePixelRatio || 1;

				ratio = (window.devicePixelRatio || 1) / backingStore;

				if (ratio > 1&&$(this).attr("val")!="true") {
					if((this.style.height == '' || Number(this.style.height.replace('px', '')) * ratio != this.height)) {
						this.style.height = this.height + 'px';
						this.style.width = this.width + 'px';
						this.width *= ratio;
						this.height *= ratio;
						$(this).attr("val",true)
					}
				}
			}

			return context;
		};
	})(prototype.getContext);
})(HTMLCanvasElement.prototype);
在 上面加一个判断,这样多次获取canvas.getContext("2d") 时就不会 吧canvas 元素放大很多倍了。 现在测试 只在 Android 6 原生的 WebView 上 才会出现这个问题。


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值