Canvas---Canvas事件处理、Canvas元素的鼠标点击事件处理、实现一个元素管理器

由于Canvas的 ”忘记式“ 绘图机制(就是它没有维护一份绘制元素的列表)。

如果仅仅检测用户是否点击整个canvas元素,只需在canvas上注册事件就好。

如果是要分别检测canvas里绘制的不同元素的鼠标点击事件,则要用下面的做法,实现一个元素管理器。

一.原理分析

1.canvas元素能提供的一个api是,context.isPointInPath(x,y),它可以判断参数的点是否在当前路径内。

2.当前路径指的是最近一次调用context.beginPath();当前路径context.closePath();中间部分的路径代码就是当前路径。

3.元素管理器维护一个元素列表,每次用户点击时,都遍历这个列表,为列表里的元素创建路径,与当前点做检测,直到找到相应的元素。

4.元素必须自己实现相应的函数:

//1.创建自身路径:createPath(context);

//2.绘制自身:drawSelf(context);

//3.点击时的时间处理:beClick();

二.效果截图

这是一个简单播放器,点击后,canvas元素的效果(图标)会变化,激活相关事件函数。

三.源代码

本文由 CSDN MIKUScallion 原创,更多canvas案例代码:http://blog.csdn.net/mikuscallion

//图片按钮
var MikuImgBtn = function(x,y,w,h){
    this.x = x;
    this.y = y;
    this.w = w;
    this.h = h;
    this.image;
    this.beClick;
    this.createPath = function(context){
        context.beginPath();
        context.rect(this.x,this.y,this.w,this.h);
        context.closePath();
    };
    this.drawSelf = function(context){
        //图片按钮
        if(this.image !== undefined){
            context.drawImage(this.image,this.x,this.y,this.w,this.h);
        }
    };
    this.addBeClick= function(beClick){
        this.beClick = beClick;
    }
};
//存储管理已经绘制的元素的一个类
//存储的元素必须实现
//1.创建自身路径:createPath(context);
//2.绘制自身:drawSelf(context);
//3.点击时的时间处理:beClick();
var MikuDrawedObjList = function (){
    var objList = [];

    this.push = function (obj){
        objList.push(obj);
    }
    this.remove = function(obj){
        for(var i = 0;i<objList.length;i++){
            var temp = objList[i];
            if(temp === obj){
                objList.splice(i,1);
                return i;
            }
        }
    }
    this.getClickObj = function (context,x,y){
        for(var i = 0; i<objList.length; i++){
            //obj必须实现这个方法
            objList[i].createPath(context);
            if(context.isPointInPath(x,y)){
                return objList[i];
            }
        }
    }
    this.drawAll = function (context){
        objList.forEach(function(obj){
            //obj必须实现这个方法
            obj.drawSelf(context);
        });
    }
}
//页面元素列表
        var activeObjList = new MikuDrawedObjList();
////按键监听//////////////////////////////////////////////////////////////////////   
        window.onclick = function(e){
            var loc = windowToCanvas(e.clientX,e.clientY);
            var clickObj = activeObjList.getClickObj(context,loc.x,loc.y);
            if(clickObj!== undefined){
                clickObj.beClick();
            }
        }





时间: 2024-08-25 16:01:57

Canvas---Canvas事件处理、Canvas元素的鼠标点击事件处理、实现一个元素管理器的相关文章

每天一个JavaScript实例-铺货鼠标点击位置并将元素移动到该位置

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>每天一个JavaScript实例-铺货鼠标点击位置并将元素移动到该位置</title> <style> #info{ width:100px; height:100px;

selenium webdriver + junit 鼠标悬停,出现另一个元素,点击这个元素的解决方法

转载自http://blog.csdn.net/hcx1234567/article/details/17605533 经千辛万苦,终于解决了 UI TA(test automation) 中的这个难题,必须记录一下. 前提是:需要测试的这个页面是用 google 的 angularjs 写的.许多页面效果是用 angularjs 自带的一些事件结合 css hover实现的.测试的 UI TA 框架用的是 selenium webdriver + junit . 问题是:页面上有一个效果:点击

5.输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。

#coding=utf-8 a= [] while 1: try: user_input = raw_input('please input a number:') if user_input.strip() =='over': break else: a.append(int(user_input)) except: print 'error,try again!' print a max_num = max(a) min_num = min(a) max_num_index = a.inde

在不知下面有几个元素的时候,要去除最后一个元素的下边框jquery代码

<script> $(document).ready(function() { $(".search_list dl").each(function() {//遍历所有dl $('.search_list dl').last().css('border-bottom','none'); }); }); </script>

输入一个一维数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。

public class shuzujiaohuan { public static void main(String[] args) {  // TODO 自动生成的方法存根  Scanner reader=new Scanner(System.in);  int[] a=new int[10];  for(int i=0;i<a.length;i++){   System.out.print("请输入"+a.length+"个数字,当前第"+(i+1)+&

点击一个按钮,将某个元素里面的值追加到另一个元素里面

代码 <tr> <td width="30%"> 案件类型: <select name="crimObjectCode" id="crimObjectCode" style="padding: 0px 8px;outline: none;margin-left:4px;width:150px; height:32px; border: 1px solid #cccccc; border-bottom: 1p

鼠标点击事件

1 鼠标点击事件 2 onclick 元素上发生鼠标点击时触发. 3 ondblclick 元素上发生鼠标双击时触发. 4 ondrag 元素被拖动时运行的脚本. 5 ondragend 在拖动操作末端运行的脚本. 6 ondragenter 当元素元素已经被拖动到有效拖放区域时运行的脚本. 7 ondragleave 当元素离开有效拖放目标时运行的脚本. 8 ondragover 当元素在有效拖放目标上正在被拖动时运行的脚本. 9 ondragstart 在拖动操作开端运行的脚本. 10 on

鼠标点击网页出现文字特效

<!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" con

2019-11-29-WPF-非客户区的触摸和鼠标点击响应

原文:2019-11-29-WPF-非客户区的触摸和鼠标点击响应 title author date CreateTime categories WPF 非客户区的触摸和鼠标点击响应 lindexi 2019-11-29 08:44:11 +0800 2019-07-02 17:15:20 +0800 WPF 默认在 WPF 里面是不响应非客户区的鼠标事件,但响应触摸事件 在没有喝下午茶的时候 lsj 告诉我,在项目里面在一个定制的窗口里面的非客户区用鼠标点击不了一个按钮,但是用触摸可以点击按钮