2013-06-12 16 views
8

Używam elementu canvas html5 do rysowania wykresu z kropkami oznaczającymi różne punkty w here.Wyświetl etykietę narzędzia na wykresie graficznym

Chcę wyświetlić różne końcówki narzędzi w różnych punktach na zawisie myszy. Tekst wyświetlany jako wskazówka narzędzia zostanie dostarczony przez użytkownika.

Próbowałem, ale nie mógł dowiedzieć się, jak dodać końcówkę narzędzia do różnych punktów w kodzie graph.The używam do wyświetlania kropki jest ..

// Draw the dots 
c.fillStyle = '#333'; 

for (var i = 0; i < data.values.length; i++) { 
    c.beginPath(); 
    c.arc(getXPixel(data.values[i].X), getYPixel(data.values[i].Y), 4, 0, Math.PI * 2, true); 
    c.fill(); 
} 

Co dodatek mam zrobić w ten kod, dzięki czemu mogę wyświetlać dane wprowadzane przez użytkownika jako wskazówka narzędzia?

Odpowiedz

17

Można wyświetlać podpowiedzi, gdy użytkownik porusza się nad wykresu danych dot

Ta etykieta to po prostu drugie płótno, które rysuje tekst z połączonego pola tekstowego i znajduje się powyżej kropki danych.

Najpierw tworzymy tablicę do przechowywania informacji z podpowiedzi dla każdej z twoich kropek danych.

var dots = []; 

Dla każdego podpowiedzi, trzeba:

  • X/Y współrzędnych danych punktów,
  • promieniowi danych punktów,
  • identyfikator pole tekstowe, z którego chcesz otrzymać wskazówkę.
  • Należy również RXR który zawsze == promień do kwadratu (konieczna podczas testowania trafień)

Oto kod do tworzenia informacji podpowiedzi mają być przechowywane w kropki []

// define tooltips for each data point 

    for(var i = 0; i < data.values.length; i ++) { 
     dots.push({ 
      x: getXPixel(data.values[i].X), 
      y: getYPixel(data.values[i].Y), 
      r: 4, 
      rXr: 16, 
      tip: "#text"+(i+1) 
     }); 
    } 

Następnie ustawić w górę handlarza myszką, który przegląda tablicę kropek.Zostanie wyświetlona podpowiedź, jeśli użytkownik porusza się wewnątrz każdej danych = kropką:

// request mousemove events 

    $("#graph").mousemove(function(e){handleMouseMove(e);}); 

    // show tooltip when mouse hovers over dot 
    function handleMouseMove(e){ 
     mouseX=parseInt(e.clientX-offsetX); 
     mouseY=parseInt(e.clientY-offsetY); 

     // Put your mousemove stuff here 
     var hit = false; 
     for (var i = 0; i < dots.length; i++) { 
      var dot = dots[i]; 
      var dx = mouseX - dot.x; 
      var dy = mouseY - dot.y; 
      if (dx * dx + dy * dy < dot.rXr) { 
       tipCanvas.style.left = (dot.x) + "px"; 
       tipCanvas.style.top = (dot.y - 40) + "px"; 
       tipCtx.clearRect(0, 0, tipCanvas.width, tipCanvas.height); 
       tipCtx.fillText($(dot.tip).val(), 5, 15); 
       hit = true; 
      } 
     } 
     if (!hit) { tipCanvas.style.left = "-200px"; } 
    } 

[Edytowane aby pasowały do ​​Twojego kodu]

Oto kod i Fiddle: http://jsfiddle.net/m1erickson/yLBjM/

<!doctype html> 
<html> 
<head> 
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css --> 
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script> 

<style> 
    body{ background-color: ivory; margin-top:35px; } 
    #wrapper{position:relative; width:300px; height:150px;} 
    canvas{border:1px solid red;} 
    #tip{background-color:white; border:1px solid blue; position:absolute; left:-200px; top:100px;} 
</style> 

<script> 
$(function(){ 

    var graph = document.getElementById("graph"); 
    var ctx = graph.getContext("2d"); 
    var tipCanvas = document.getElementById("tip"); 
    var tipCtx = tipCanvas.getContext("2d"); 

    var canvasOffset = $("#graph").offset(); 
    var offsetX = canvasOffset.left; 
    var offsetY = canvasOffset.top; 

    var graph; 
    var xPadding = 30; 
    var yPadding = 30; 

    // Notice I changed The X values 
    var data = { values:[ 
     { X: 0, Y: 12 }, 
     { X: 2, Y: 28 }, 
     { X: 3, Y: 18 }, 
     { X: 4, Y: 34 }, 
     { X: 5, Y: 40 }, 
     { X: 6, Y: 80 }, 
     { X: 7, Y: 80 } 
    ]}; 

    // define tooltips for each data point 
    var dots = []; 
    for(var i = 0; i < data.values.length; i ++) { 
     dots.push({ 
      x: getXPixel(data.values[i].X), 
      y: getYPixel(data.values[i].Y), 
      r: 4, 
      rXr: 16, 
      color: "red", 
      tip: "#text"+(i+1) 
     }); 
    } 

    // request mousemove events 
    $("#graph").mousemove(function(e){handleMouseMove(e);}); 

    // show tooltip when mouse hovers over dot 
    function handleMouseMove(e){ 
     mouseX=parseInt(e.clientX-offsetX); 
     mouseY=parseInt(e.clientY-offsetY); 

     // Put your mousemove stuff here 
     var hit = false; 
     for (var i = 0; i < dots.length; i++) { 
      var dot = dots[i]; 
      var dx = mouseX - dot.x; 
      var dy = mouseY - dot.y; 
      if (dx * dx + dy * dy < dot.rXr) { 
       tipCanvas.style.left = (dot.x) + "px"; 
       tipCanvas.style.top = (dot.y - 40) + "px"; 
       tipCtx.clearRect(0, 0, tipCanvas.width, tipCanvas.height); 
       tipCtx.fillText($(dot.tip).val(), 5, 15); 
       hit = true; 
      } 
     } 
     if (!hit) { tipCanvas.style.left = "-200px"; } 
    } 

// niezmieniony kod następuje po

// Returns the max Y value in our data list 
    function getMaxY() { 
     var max = 0; 

     for(var i = 0; i < data.values.length; i ++) { 
      if(data.values[i].Y > max) { 
       max = data.values[i].Y; 
      } 
     } 

     max += 10 - max % 10; 
     return max; 
    } 

    // Returns the max X value in our data list 
    function getMaxX() { 
     var max = 0; 

     for(var i = 0; i < data.values.length; i ++) { 
      if(data.values[i].X > max) { 
       max = data.values[i].X; 
      } 
     } 

     // omited 
     //max += 10 - max % 10; 
     return max; 
    } 

    // Return the x pixel for a graph point 
    function getXPixel(val) { 
     // uses the getMaxX() function 
     return ((graph.width - xPadding)/(getMaxX() + 1)) * val + (xPadding * 1.5); 
     // was 
     //return ((graph.width - xPadding)/getMaxX()) * val + (xPadding * 1.5); 
    } 

    // Return the y pixel for a graph point 
    function getYPixel(val) { 
     return graph.height - (((graph.height - yPadding)/getMaxY()) * val) - yPadding; 
    } 

     graph = document.getElementById("graph"); 
     var c = graph.getContext('2d');    

     c.lineWidth = 2; 
     c.strokeStyle = '#333'; 
     c.font = 'italic 8pt sans-serif'; 
     c.textAlign = "center"; 

     // Draw the axises 
     c.beginPath(); 
     c.moveTo(xPadding, 0); 
     c.lineTo(xPadding, graph.height - yPadding); 
     c.lineTo(graph.width, graph.height - yPadding); 
     c.stroke(); 

     // Draw the X value texts 
     var myMaxX = getMaxX(); 
     for(var i = 0; i <= myMaxX; i ++) { 
      // uses data.values[i].X 
      c.fillText(i, getXPixel(i), graph.height - yPadding + 20); 
     } 
     /* was 
     for(var i = 0; i < data.values.length; i ++) { 
      // uses data.values[i].X 
      c.fillText(data.values[i].X, getXPixel(data.values[i].X), graph.height - yPadding + 20); 
     } 
     */ 

     // Draw the Y value texts 
     c.textAlign = "right" 
     c.textBaseline = "middle"; 

     for(var i = 0; i < getMaxY(); i += 10) { 
      c.fillText(i, xPadding - 10, getYPixel(i)); 
     } 

     c.strokeStyle = '#f00'; 

     // Draw the line graph 
     c.beginPath(); 
     c.moveTo(getXPixel(data.values[0].X), getYPixel(data.values[0].Y)); 
     for(var i = 1; i < data.values.length; i ++) { 
      c.lineTo(getXPixel(data.values[i].X), getYPixel(data.values[i].Y)); 
     } 
     c.stroke(); 

     // Draw the dots 
     c.fillStyle = '#333'; 

     for(var i = 0; i < data.values.length; i ++) { 
      c.beginPath(); 
      c.arc(getXPixel(data.values[i].X), getYPixel(data.values[i].Y), 4, 0, Math.PI * 2, true); 
      c.fill(); 
     } 


}); // end $(function(){}); 
</script> 

</head> 

<body> 
    <div id="wrapper"> 
     <canvas id="graph" width=300 height=150></canvas> 
     <canvas id="tip" width=100 height=25></canvas> 
    </div> 
    <br><br> 
    <input type="text" id="text1" value="text 1"/><br><br> 
    <input type="text" id="text2" value="text 2"/><br><br> 
    <input type="text" id="text3" value="text 3"/><br><br> 
    <input type="text" id="text4" value="text 4"/><br><br> 
    <input type="text" id="text5" value="text 5"/><br><br> 
    <input type="text" id="text6" value="text 6"/><br><br> 
    <input type="text" id="text7" value="text 7"/><br><br> 
</body> 
</html> 
+0

Próbowałem, wprowadzając kod w moim kodzie tutaj http://jsfiddle.net/nshX6/9/. Nawet jeśli nie otrzymuję błąd, nie otrzymuję żadnego wyjścia .. co robię źle w moim kodzie .. Proszę o pomoc .. – Lucy

+0

Edytowałem swoją odpowiedź, aby pokazać, jak dołączyć podpowiedzi do wykresu. Szczęśliwe kodowanie! :) – markE

+0

Bardzo dziękuję za pomoc !!!! :) kod działa jak urok !!! :) :) – Lucy

0

Krótka odpowiedź: jak już to zrobiliście, nie możecie.

Długa odpowiedź: możesz, ale musisz uzyskać dokładną pozycję myszy co 30 milisekund. Przez każdą milisekundę musisz sprawdzić, czy mysz przesuwa się po kropce, ponownie narysować ekran i wyświetlić etykietkę narzędzia, jeśli to robi. Robienie tego samemu może być uciążliwe, dlatego używam gee.js.

Sprawdź ten przykład: http://jsfiddle.net/Saturnix/Aexw4/

Jest to wyrażenie, które kontroluje zawis Mysz:

g.mouseX < x + r && g.mouseX > x -r && g.mouseY > y -r && g.mouseY < y+r 
+0

można dać przykład, w którym wartości pola tekstowe są wyświetlane jako podpowiedzi ??? i mówi na stronie internetowej gee.js, że nie jest już wspierany i należy zamiast tego używać pliku paper.js .. – Lucy

-3

Metoda TYLKO CSS tutaj. Nie są wymagane żadne javascript, JQUERY ani specjalna biblioteka. Lekki, seksowny.

HTML

<!DOCTYPE html> 
<body> 
    <br /> 
    <br /> 
    <br /> 
    <br /> 
<span class="popup" popupText="This is some popup text">Locate </span> 
<img src="http://upload.wikimedia.org/wikipedia/en/thumb/f/f4/The_Scream.jpg/220px-The_Scream.jpg" 
    /> 
<!--I used an image here but it could be anything, including a canvas--> 
</body> 
</html> 

CSS

.popup{ 
    position:absolute; /*allows span to be on top of image*/ 
    border: solid; /*a border, just for demonstration purposes*/ 
    border-color: #333 ; 
    border-width: 1px; 
    width:220px; /*set the height, width equal to the size of your ing/canvas*/ 
    height:280px; 
} 
/*this bit draws the bottom arrow of the popup, it can excluded entire if you don't want it*/ 
.popup:hover:before{ 
    border: solid; 
    border-color: #333 transparent; 
    border-width: 6px 6px 0 6px; 
    bottom: 300px; 
    content: ""; 
    left: 40px; 
    position: absolute; 
    z-index: 99; 
} 
/*this bit draw the main portion of the popup, including the text*/ 
.popup:hover:after{ 
    background: #333; 
    background: rgba(0,0,0,.8); 
    border-radius: 5px; 
    bottom: 306px; 
    color: #fff; 
    content: attr(popupText); /*this is where the text gets introduced.*/ 
    left: 20px; 
    padding: 5px 15px; 
    position: absolute; 
    z-index: 98; 
    width: 150px; 
} 

Oto skrzypce. http://jsfiddle.net/honkskillet/RKnEu/

+0

To nie odpowiada na oryginalne pytanie. Narysujesz podpowiedź na górze kontrolki. Chce narysować go w dowolnym miejscu na płótnie w oparciu o zawartość płótna. Jeśli ma 2 okręgi, chce wyświetlać 1 inną etykietę przy każdym okręgu. Biorąc pod uwagę pozycję kółka jest dynamiczny. –

1

Próbowałem rozwiązania markE i działało bezbłędnie, Z WYJĄTKIEM, że podczas przewijania w dół tylko trochę (np. Gdy masz trochę płótna w dół strony).

Następnie pozycje gdzie mouseover są ujmowane przesunie się na dole tej samej długości i może się zdarzyć, że kończy się poza obszar roboczy i nie będą rozpoznawane w ogóle ...

Podczas korzystania MouseEvent .pageX i mouseEvent.pageY zamiast .clientX i .clientY, powinno być dobrze. Aby uzyskać więcej kontekstu, tutaj jest mój kod:

// Filling the dots 
var dots = []; 
// [...] 
dots.push({ 
    x: xCoord, 
    y: yCoord, 
    v: value, 
    r: 5, 
    tooltipRadius2: 7*7 // a little increased radius for making it easier to hit 
}); 
// [...] 

var tooltipCanvas = $('#tooltipCanvas')[0]; 
var tooltipCtx = tooltipCanvas.getContext('2d'); 
var canvasOffset = canvas.offset(); 
canvas.mousemove(function (e) { 

    // getting the mouse position relative to the page - not the client 
    var mouseX = parseInt(e.pageX - canvasOffset.left); 
    var mouseY = parseInt(e.pageY - canvasOffset.top); 

    var hit = false; 
    for (var i = 0; i < dots.length; i++) { 
     var dot = dots[i]; 
     var dx = mouseX - dot.x; 
     var dy = mouseY - dot.y; 
     if (dx * dx + dy * dy < dot.tooltipRadius2) { 
      // show tooltip to the right and below the cursor 
      // and moving with it 
      tooltipCanvas.style.left = (e.pageX + 10) + "px"; 
      tooltipCanvas.style.top = (e.pageY + 10) + "px"; 
      tooltipCtx.clearRect(0, 0, tooltipCanvas.width, tooltipCanvas.height); 
      tooltipCtx.textAlign = "center"; 
      tooltipCtx.fillText(dot.v, 20, 15); 
      hit = true; 
      // when a dot is found, don't keep on searching 
      break; 
     } 
    } 
    if (!hit) { 
     tooltipCanvas.style.left = "-200px"; 
    } 
}); 
Powiązane problemy