canvas繪制文本自動換行


<!DOCTYPE html>
<html lang="zh">
	<head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<meta http-equiv="X-UA-Compatible" content="ie=edge">
		<title></title>
		<style type="text/css">
			body {
				padding: 20px;
				background: #eee;
			}

			#canvas {
				border: 1px solid #ccc;
			}
		</style>
	</head>
	<body>
		<canvas id="canvas" width="600" height="400"></canvas>
	</body>
	<script type="text/javascript">
		//尋找切換斷點
		function findBreakPoint(text, width, context) {
			var min = 0;
			var max = text.length - 1;

			while (min <= max) {
				var middle = Math.floor((min + max) / 2);
				var middleWidth = context.measureText(text.substr(0, middle)).width;
				var oneCharWiderThanMiddleWidth = context.measureText(text.substr(0, middle + 1)).width;
				if (middleWidth <= width && oneCharWiderThanMiddleWidth > width) {
					return middle;
				}
				if (middleWidth < width) {
					min = middle + 1;
				} else {
					max = middle - 1;
				}
			}

			return -1;
		}

		function breakLinesForCanvas(text, width, font) {
			var canvas = document.getElementById('canvas');
			var context = canvas.getContext('2d');
			var result = [];
			var breakPoint = 0;

			if (font) {
				context.font = font;
			}

			while ((breakPoint = findBreakPoint(text, width, context)) !== -1) {
				result.push(text.substr(0, breakPoint));
				text = text.substr(breakPoint);
			}

			if (text) {
				result.push(text);
			}

			return result;
		}

		var result = breakLinesForCanvas(
			'使用很尋常的二分查找,如果某一個位置之前的文字寬度小於等於設定的寬度,並且它之后一個字之前的文字寬度大於設定的寬度,那么這個位置就是文本的換行點。上面只是找到一個換行點,對於輸入的一段文本,需要循環查找,直到不存在這樣的換行點為止, 完整的代碼如下',
			300, '16px 微軟雅黑');
		console.log(result);

		var lineHeight = 30;
		var context = document.getElementById('canvas').getContext('2d');
		context.font = "16px 微軟雅黑";

		result.forEach(function(line, index) {
			context.fillText(line, 100, lineHeight * index + 30);
		});
	</script>
</html>

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM