1. 程式人生 > >canvas(11/30)--------事件處理(滑鼠處理)精靈表座標檢視器

canvas(11/30)--------事件處理(滑鼠處理)精靈表座標檢視器

滑鼠處理

使用監聽器,可以通過onmousemove,onmouseup,onmouseout或者onmousedown來註冊監聽器。

使用onmousedown,onmousemove這樣的方式來註冊監聽器,比呼叫addEventListener()要稍微簡單一點,如果滑鼠事件要註冊多個監聽器的時候,那就要使用addEventListener()。

實現精靈表座標檢視器:

examp1.js

var canvas = document.getElementById('canvas'),
	readout = document.getElementById('readout'),
	context = canvas.getContext('2d'),
	spritesheet = new Image();


//Functions
//將滑鼠座標轉換成canvas座標
function windowToCanvas(canvas,x,y) {
	var bbox = canvas.getBoundingClientRect();
	return {
		x:x - bbox.left * (canvas.width / bbox.width),
		y:y - bbox.top * (canvas.height / bbox.height)
	};
}

function drawBackground(){
	var VERTICAL_LINE_SPACING = 12;
		i = context.canvas.height;
	//清屏
	context.clearRect(0,0,canvas.width,canvas.height);
	context.strokeStyle = 'lightgray';
	context.lineWidth = 0.5;

	while(i > VERTICAL_LINE_SPACING*4){
		context.beginPath();
		//繪畫從(0,i)繪製到(context.canvas.width,i)這條直線通過moveTo和lineTo函式進行繪畫的
		context.moveTo(0,i);
		context.lineTo(context.canvas.width,i);
		context.stroke();
		i -=VERTICAL_LINE_SPACING;

	}
}

//繪畫精靈表
function drawSpritesheet(){
	//drawImage(圖片,x,y)
	context.drawImage(spritesheet,0,0);
}

function drawGuidelines(x,y){
	context.strokeStyle = 'rgba(0,0,230,0.8)';
	context.lineWidth = 0.5;
	drawVerticalLine(x);
	drawHorizontalLine(y);
}

//座標的顯示
function updateReadout(x,y) {
	//toFixed() 方法可把 Number 四捨五入為指定小數位數的數字。
	readout.innerText = '(' + x.toFixed(0) + ',' +  y.toFixed(0) +')';
}

//繪製水平線
function drawHorizontalLine(y) {
	context.beginPath();
	context.moveTo(0,y+0.5);
	context.lineTo(context.canvas.width,y+0.5);
	context.stroke();
}

//繪製垂直線
function drawVerticalLine(x) {
	context.beginPath();
	context.moveTo(x+0.5,0);
	context.lineTo(x+0.5,context.canvas.height);
	context.stroke();
}
//滑鼠移動的位置
canvas.onmousemove = function (e) {
	var loc = windowToCanvas(canvas,e.clientX,e.clientY);

	drawBackground();
	drawSpritesheet();
	drawGuidelines(loc.x,loc.y);
	updateReadout(loc.x,loc.y);
}
//匯入圖片
spritesheet.src = 'a.png';
spritesheet.onload = function(e){
	drawSpritesheet();
}
//繪畫
drawBackground();




html:

<html>
<head>
<title>sprite sheets</title>
<style>
	body {
		background: #dddddd;
	}

	# canvas {
		position: absolute;
		left: 0px;
		top: 20px;
		margin: 20px;
		background: #ffffff;
		border: thin inset rgba(100,150,230,0.5);
		cursor:pointer;
	}

	#readout {
		margin-top: 10px;
		margin-left: 15px;
		color: blue;
	}
</style>
</head>

<body>
	<div id="readout"></div>
	<canvas id="canvas" width="500" height="250">canvas not supported</canvas>
	<script src='example1.js'></script>
</body>
</html>

還需要一張圖片:a.png

相關推薦

canvas11/30--------事件處理滑鼠處理精靈座標檢視

滑鼠處理 使用監聽器,可以通過onmousemove,onmouseup,onmouseout或者onmousedown來註冊監聽器。 使用onmousedown,onmousemove這樣的方式來註冊監聽器,比呼叫addEventListener()要稍微簡單一點,如果滑

canvas11/30--------事件處理區域性圖片放大

example2.js var canvas = document.getElementById('canvas'); context = canvas.getContext('2d'); rubberbandDiv = document.getElementById

PSP&進度條11/30

技術 進度 com 分享圖片 amp img image http 代碼行數 一、PSP 二、PSP餅狀圖 三、進度條 四、代碼行數、博文字數累積表 五、代碼行數、博文字數累積折線圖 PSP&進度條(11/30)

python筆記11.30-2.0-2.4

2.0-2.4 內建函式一個函式可以說是一個邏輯或者功能.使用ipython檢視python的內建函式builtin. 顯示一共有137個內建函式也可以登入https://docs.python.org/2/library 官網去查詢 •返回數字的絕對值abs() abs(-10) 返回的是10 •取列表

上週熱點回顧11.30-12.6

熱點隨筆: · 北漂碼農的我,把在大城市過成了屯子一樣舒服,哈哈哈哈哈! (小傅哥)· 蹉跎了歲月,竟又是一年 (鄒瓊俊)· 《部落格園.NET歷險記》第2季 - 故障公告:高併發下全線崩潰 (部落格園團隊)

2017.11.30 Reat前後端數據交互之Button提交數據處理ajax方法單獨封裝成API,不用Form

logs 處理 mage mongoose 技術 module strong 輸入框 reat 1.按鈕定義: 2.引入外部js文件(封裝了ajax方法的文件):註意目錄結構 3.調用ajax文件中的具體方法: 4.關於ajax文件中方法的編寫語法: 寫

事件處理

blog lis 監聽 上下 strong 單擊 長按 view 處理方法 事件處理步驟: 1.註冊事件監聽器 2.根據指定的事件中編寫事件處理的代碼 3.在事件處理的代碼證完成對事件的處理 事件處理方法 1.setOnClickListener(View.OnC

Qt事件機制是動作發生後,一種通知對象的消息,是被動與主動的總和。先處理自己隊列中的消息,然後再處理系統消息隊列中的消息

str 發送 filter 簡化 後者 nts 類型 min() 鼠標滾輪 Qt事件機制 Qt程序是事件驅動的, 程序的每個動作都是由幕後某個事件所觸發.。 Qt事件的發生和處理成為程序運行的主線,存在於程序整個生命周期。 Qt事件的類型很多, 常見的qt的事件如下:

7-27 家譜處理30

tor lang -html 沒有 初始 實例 至少 getc truct 人類學研究對於家族很感興趣,於是研究人員搜集了一些家族的家譜進行研究。實驗中,使用計算機處理家譜。為了實現這個目的,研究人員將家譜轉換為文本文件。下面為家譜文本文件的實例: John Rober

Netty事件監聽和處理

事件處理 多路復用 linu 自定義事件 性能 cdn 處理請求 fancybox 客戶 陪產假結束了,今天又開始正常上班了,正好趕上米粉節活動,又要忙上一陣了,米粉節活動時間為4.03 - 4.10,有不少優惠,感興趣的可以關註mi.com或小米商城app。 今天

Netty事件監聽和處理

關註 proto cte meta pro sse cti 讀取 線程模型 上一篇 介紹了事件監聽、責任鏈模型、socket接口和IO模型、線程模型等基本概念,以及Netty的整體結構,這篇就來說下Netty三大核心模塊之一:事件監聽和處理。 前面提到,Netty是一個N

Kafka設計解析二十二Flink + Kafka 0.11端到端精確一次處理語義的實現

pac 內部 通知 發生 ng- 設計 解析 位移 eas 轉載自 huxihx,原文鏈接 【譯】Flink + Kafka 0.11端到端精確一次處理語義的實現 本文是翻譯作品,作者是Piotr Nowojski和Michael Winters。前者是該方案的實現

Spring入門學習筆記3——事件處理

aware super 不能 href his 應用 odi eap app 目錄 Spring中的事件處理 Spring內建事件 監聽Context事件 Example 自定義Spring事件 Spring中的事件處理 ApplicationContext 是Spr

第六章樹和二叉樹--樹和森林-計算機17級 7-2 家譜處理 30

7-2 家譜處理 (30 分) 人類學研究對於家族很感興趣,於是研究人員蒐集了一些家族的家譜進行研究。實驗中,使用計算機處理家譜。為了實現這個目的,研究人員將家譜轉換為文字檔案。下面為家譜文字檔案的例項: John Robert Frank And

Flask框架後端開發常見錯誤處理2018/11/14

Flask常見錯誤與解決方法(By Wdx) 1.ValueError: urls must start with a leading slash 這個錯誤原因可能發生在所有路由相關地方,少加了一個'/'造成的。 2.ImportError: cannot import name 'db' 這個錯誤原

3號團隊-團隊任務3:每日例會2018-11-30

其中 管理系 文字 產品 nbsp 產品經理 變量 測試工程師 遇到 1.團隊信息 3號團隊 畢設管理管理系統 今日整理人:周美國 團隊中職務為:項目經理   軟件工程師:王誌明,張震   軟件測試工程師:王熹   項目經理:周美國   產品經理兼UI設

04號團隊-團隊任務3:每日立會2018-11-30

團隊資訊  團隊序號:04   開發軟體名稱:飛機大戰   今日整理人:王擎 學號 2016035107231 團隊職務:產品經理     團隊彙報  由於專案經理和軟體測試師生病住院已離開團隊。夏大偉老師已經同意。現團隊只有UI設計師王

一號團隊-團隊任務3:每日立會2018-11-30

原型 序號 問題 ui設計 繼續 甘特圖 技術 昨天 成員 一.基本信息 團隊序號:一號 開發的軟件名稱:Java教學官網 撰寫人:張浩洋 學號:2016035107283 職務:項目經理 二.團隊匯報 1.匯報文字版 一號團隊全體成員與2018年11月30日在第一組項目群

9號團隊-團隊任務4:每日立會2018-11-30

任務 打飛機 .com 匯報 mage 序號 整理 com 軟件 團隊序號:9號團隊 開發的軟件名稱:打飛機 今日整理人姓名:王楠 學號:2016035107255 團隊中的職務:項目經理 小組成員:

七號團隊-團隊任務4:每日例會2018-11-30

1.團隊序號:第七團隊    開發的軟體名稱:兔窩保衛戰    撰寫人:張炎和    學號:2016035107294    團隊職務:專案經理     2.團隊彙報:   &n