1. 程式人生 > >hidpi-canvas-polyfill.js 多次呼叫canvas.getContext('2d') 導致畫布放大問題

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 上 才會出現這個問題。

相關推薦

hidpi-canvas-polyfill.js 呼叫canvas.getContext('2d') 導致畫布放大問題

相信做前端的 對hidpi-canvas-polyfill.js  都不陌生; 手機端的高清屏上 用canvas 畫圖,大部分 都用到了hidpi-canvas-polyfill.js ; 這個包在高清屏上很好用,但在使用時 可能也會遇到一些問題。 我在使用時就遇到一個,和

在vue中呼叫同一個定義全域性變數的例項

在Vue開發中,有很多場景會用到多次重複的API請求。 例如: 前端精品教程:百度網盤下載 ? 1

用面向物件重寫thread 實現呼叫一個執行緒

思路:   利用thread類中,run方法在子執行緒中呼叫,其他方法在主執行緒呼叫,所以將生產者寫入主執行緒,將消費者寫入run函式中在子執行緒中執行,完成生產者消費者模型 注意:   1.  要在 init 函式中例項化一個Queue佇列作為生產者消費者中介   2.  要在 init 函式中把d

微信小程式中動畫呼叫的問題

function hideMsg(that) { var animation = wx.createAnimation({ duration: 1500, timingFunction: 'linear', }) that.animation = animation

【記坑】Iterator遍歷時,呼叫next(),二遍歷需要從Collection重新獲取迭代器

【記坑】Iterator遍歷時,多次呼叫next(),二次遍歷需要從Collection重新獲取迭代器 2018年02月10日 11:02:46 閱讀數:681 業務需求,從一份excel表中取到X軸(專案)和Y軸(平臺)的資料,和資料庫中的資料進行比較,如果匹配不上,則把所有匹配不上的

呼叫同一非同步方法體會出現使用相同的屬性值問題

《一》執行同一個方法體,裡面有非同步的邏輯程式碼,如果這個非同步請求還沒有執行完畢時,我們又對它進行了第二次呼叫,它會使用最後一次的執行操作。例如:   var test = {   init:function(){ this.temp = "temp" +

jquery on()事件呼叫解決辦法

今天閒的沒事 寫了個時時監控input框的元件,在用on() 方法進行繫結change事件時發現出現多次呼叫的情況。 現在說說自己的解決方法,和大家分享一下: var validators = function() { $(document).on("cha

驗證:呼叫WSAStartup會發生什麼?

有時候,總想驗證一些奇怪的想法,乾脆就寫下來,以備後查。 想法:多次呼叫WSAStartup會發生什麼? void TestCase_WSAStartupAndCleanup() { WORD versionRequested1_1, versionRequested2

呼叫Promise的then會返回什麼?

//做飯 function cook(){ console.log('開始做飯。'); var p = new Promise(function(resolve, reject){ //做一些非同步操作 setTimeout(function(){

防止使用者連續擊鍵,呼叫ajax時,即防抖的封裝

在文字框中常常有這樣的需求,鍵入值時,實時呼叫相應的介面,但是每次觸發keydown都觸發,會嚴重消耗網頁的效能 基於此,可以進行封裝,設定鍵入值得間隔在一秒之內只調用一次,程式碼如下 呼叫如下 $("input").on("keydown",debounce(fu

fragment複用至EventBus呼叫

專案是mvp模式開發的,中間有一個tablayout,每個標籤都是fragment複用,通過model請求不同資料展示,發現一個問題,多次滑動之後,每個fragment最後都顯示同一個內容,看起來好像fragment複用有問題,每次取得是同一個fragment。

quartz 暫停後重新啟動,在暫停時 被暫停後的任務,在啟動後會補償執行即 會連續呼叫job中的execute方法。

public String add() throws IOException, SchedulerException {// 一定要緊跟Validate之後寫驗證結果類String seconds = job.getCronExpression();//String cronExp = "0/" + sec

ScrollView巢狀GridView導致getView時 position=0呼叫

多次呼叫的原因:GridView的寬度高度不確定,getView會多執行position=0來計算item的高度和寬度。 經測試可用的解決方案:(禁止多次執行position=0的方法暫無,以下程式碼

標頭檔案被呼叫時的解決辦法

微控制器程式設計中有時會出現標頭檔案多次呼叫,編譯時導致結構體函式被重複定義的錯誤以STM3210X為例當頭檔案stm32f10x.h被多次呼叫時,會出現函式體被多次定義的錯誤,此時在標頭檔案中新增#ifndef __STM32F10X_H#define __STM32F10

防止onclick事件呼叫

//程式碼3 submitButton.setOnClickListener(new NoDoubleClickListener() { @Override public void onNoDoubleClick(View v)

徹底解決listview,gridview的getview呼叫問題

listview,gridview,有時候getview會呼叫多次,特別是把listview放在viewpager中,很容易卡頓 網上的方法往往只是說,把listview的height固定住或者fill_parent,其實這樣簡單的listview是有效的,但是item如

Vue的一些API理解整理,如何一引入呼叫

在我們做vue專案時通常會創一個config資料夾,裡面一般會包含 api.js和index.js,其中api.js一般用於存放一些url地址,例如 let base = 'http://192.168.1.110:8081/hhdj/' export d

解決XRecyclerView動態切換佈局管理器 呼叫setAdapter崩潰

在做到類似於淘寶的商品列表介面時,要動態切換佈局管理器。由於之前使用原生RecyclerView加XRefreshView巢狀在DrawableLayout裡,結果XRefreshView上拉加載出了問題,所以只能換XRefreshView來做,剛開始一切都好,就在提交程式

點選UITableViewCell.selected方法被呼叫的解決方案

PS:自打使用了self-manager的設計模式.跳轉控制器變得方便多了. 某天.更新Xcode之後發現一個BUG.就是點選Cell之後方法執行兩遍.WTF? - (void)setSelected:(BOOL)selected animate

android SAX解析的characters方法被呼叫

android SAX解析,為什麼總是對一個tag執行三次 character()方法 原因是xml檔案中含有\n 和 \t ,解析完想解析的內容之後,後面緊隨的\n 和換行之後縮排帶來的\t 同樣會執行characters方法。 解決辦法: String.replace(