箭头随着手指滑动而旋转(二)

一、说明

这篇文章和我的上一篇文章 《箭头随着手指滑动而旋转(一)》 有所不同,上一篇文章中的箭头方向始终指向触摸点的位置,这篇文章的箭头方向是在上一次方向的基础上进行改变。

话不多说,开始实现这个需求。

二、思路

1.首先写出一个canvas绘制箭头的函数

2.初始化开始的坐标startX和startY, 移动的距离moveX和moveY, 旋转的角度rotation,起始点的角度angle1,结束点的角度angle2,旋转的比率rate(可选)

3.给canvas元素绑定touch事件,

当touchstart的时候,记录下当前触摸点的startX、startY以及angle1;

当touchmove的时候,计算从上一触摸点到当前触摸点的移动距离moveX、moveY,上一个触摸点的角度angle1,当前触摸点的角度angle2,

此时旋转的角度rotation=angle2-angle1;如果需要旋转比率rate的话,rotation=(angle2-angle1)*rate;

4.然后初始化箭头对象,利用window.requestAnimationFrame循环绘制箭头

三、代码实现

arrow.js

function Arrow(){
	this.x=0;
	this.y=0;
	this.rotation=0;
	this.color="#ff0";
}

Arrow.prototype.draw=function(context){
	context.save();
	context.translate(this.x,this.y);
	context.rotate(this.rotation);
	context.fillStyle=this.color;
	context.lineWidth=2;
	context.beginPath();
	context.moveTo(-50,-25);
	context.lineTo(0,-25);
	context.lineTo(0,-50);
	context.lineTo(50,0);
	context.lineTo(0,50);
	context.lineTo(0,25);
	context.lineTo(-50,25);
	context.lineTo(-50,-25);
	context.fill();
	context.stroke();
	context.restore();
}

  

  utils.js

var utils={
	//element是绑定触摸事件的元素,centerX和centerY分别是箭头旋转中心点的x,y坐标
	captureTouch:function(element,obj){
		var rate=obj.rate||1;
		var centerX=obj.centerX||0;
		var centerY=obj.centerY||0;
		var touch={x:null,y:null,isPressed:false,rotation:obj.rotation||0}
		var startX=null,startY=null,angle1=null,angle2=null,moveX=null,moveY=null;
		element.addEventListener("touchstart", function(e) {
			touch.isPressed=true;
			startX = e.touches[0].clientX;
			startY = e.touches[0].clientY;
			angle1 = Math.atan2(startY - centerY, startX - centerX);
		}, false);
		element.addEventListener("touchmove", function(e) {
			angle1 = Math.atan2(startY - centerY, startX - centerX);
			moveX = e.touches[0].clientX - startX;
			moveY = e.touches[0].clientY - startY;
			startX = e.touches[0].clientX;
			startY = e.touches[0].clientY;
			angle2 = Math.atan2(startY - centerY, startX - centerX);
			touch.rotation += (angle2 - angle1) * rate;
		}, false);
		element.addEventListener("touchend", function(e) {
				touch.isPressed=false;
		}, false);
		return touch;
	}

}

  

  index.js

document.addEventListener("touchmove", function(e) {
	e.preventDefault();
}, false);
var canvas = document.querySelector("#canvas");
canvas.width = document.documentElement.clientWidth || document.body.clientWidth;
canvas.height = document.documentElement.clientHeight || document.body.clientHeight;
var context = canvas.getContext("2d");
var canW = canvas.width / 2;
var canH = canvas.height / 2;
var arrow = new Arrow();
arrow.x = canW;
arrow.y = canH;

var touch_event = utils.captureTouch(canvas, {
	centerX: canW,
	centerY: canH,
	rotation: 0,
	rate: 1
});

(function drawFrame() {
	window.requestAnimationFrame(drawFrame);
	context.clearRect(0, 0, canvas.width, canvas.height);
	arrow.rotation = touch_event.rotation;
	arrow.draw(context);

})();

  

  html

<!DOCTYPE html>
<html>

	<head>
		<meta charset="utf-8" />
		<title></title>

	</head>

	<body>
		<canvas id="canvas"></canvas>
		<script src="js/arrow.js" type="text/javascript" charset="utf-8"></script>
		<script src="js/utils.js" type="text/javascript" charset="utf-8"></script>
		<script src="js/index.js" type="text/javascript" charset="utf-8"></script>
	</body>
</html>

  

  

时间: 2024-08-04 08:31:40

箭头随着手指滑动而旋转(二)的相关文章

移动端能用手指滑动的焦点轮播图

要使用到一个库--swipe.js,专门用来制作能够用手指滑动的焦点轮播图的.在网上下载swipe.js包,下载链接:https://codeload.github.com/thebird/Swipe/zip/2.0.0,下载后解压,文件夹名字为:swipe-master. (1)添加视口约束: (2)引入js包 (3)注意事项: // 布局, 在body标签里面,添加一个父盒子,这个父盒子可以任意取id(eg:<div id="jiaodiantu">).里面必须内嵌一个

H5+CSS3实现手指滑动切换图片

包含3个文件:html.slider-H5.js.jquery.js(自行下载).在html中可配置滑动参数.具体代码如下: HTML代码: <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"/> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <m

用HTML和javascript(JS)计算触屏手机手指滑动方向的演示

移动终端的流行,程序员希望通过HTML+JS完成触屏动作的识别.下面给出具体实现的例子,供大家参考. 将下面的代码复制并保存,用手机访问,现在的手机浏览器一般都支持触屏,针对本演示来讲就是支持三个js事件: 1.touchstart---手指开始触摸事件,此事件可以获取起始坐标,将起始坐标保存在pressX 和pressY 中. 2.touchmove---手机触摸移动时间,只要手机不离开指定元素,就不停的将手机的新坐标通过事件发给页面上的js代码.通过计算此事件获取的当前坐标与起始坐标的差,就

禁止了鼠标或者是手指滑动的默认事件,后期需要恢复,该怎么做呢

做前端开发,需要根据不同时期的需求做针对性的处理,特别是Javascript中的事件处理,如果刚开始禁止了鼠标或者是手指滑动的默认事件,后期需要恢复,该怎么做呢?我今天做了下测试,没什么问题! var mark = true; document.onclick = function(){ if(mark){ mark = false; $("body").bind("touchmove",function(event){ event.preventDefault()

HTML5手机端手指滑动上拉加载代码

在线预览   源码下载 HTML5手机端手指滑动上拉加载代码是一款通过jquery实现tab切换和上拉加载更多的效果,适用于手机端页面开发.该特效适用浏览器:360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之窗. 不支持IE8及以下浏览器. 加入前端爱好者QQ群(123235875) 点击加群,共同交流进度!

Android手指滑动切换页面

Android手指滑动切换页面 介绍:实现手指滑动切换页面,页面头部的tab下方出现一个条纹来显示当前页面.也可以点击tab来切换页面.可以更改tab的配色方案. 下载地址:http://www.devstore.cn/code/info/1080.html 运行截图: 热门源码下载: 高仿京东商城 Android快速开发不可或缺的11个工具类 Android快速开发框架LoonAndroid Android应用源码比较不错的新闻客户端 版权声明:本文为博主原创文章,未经博主允许不得转载.

左右箭头+按钮+左右滑动幻灯

左右箭头+按钮+左右滑动幻灯 点击下载

《移动端浏览器Touch事件判断手指滑动方向方法》

1 $("body").on("touchstart", function(e) { 2     e.preventDefault(); 3     startX = e.originalEvent.changedTouches[0].pageX, 4     startY = e.originalEvent.changedTouches[0].pageY; 5 }); 6 $("body").on("touchmove",

移动端js手指滑动事件初体验

今天在公司遇到做一个移动端手指滑动的效果,刚开始用了swiper.js插件发现效果不好(文字存在模糊效果).后来查了一些资料,自己手写了一个使用原生js写的滑动效果. 下面直接上代码: <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=