简体   繁体   中英

how do make the radius of the circle responsive in canvas element?

I have a canvas element in which I have drawn a circle. How do I give the responsiveness to the canvas element?

If the width of the browser changes I need to change the radius by some amount, if the height of the browser changes I need to change the radius by some amount.

For that how do I need to calculate the changing ratio?

var canvasWidthRatio = currentDivWidth / initialDivWidth;
var canvasHeightRatio = currentHeight / initialDivHeight;
radius = (I need something here)

try this

var radius = 10; // set default radius to start with
var radiusX = Math.min(currentDivWidth , radius); // set horizontal radius to be atleast as wide as width of div
var radiusY = Math.min(currentDivHeight , radius); // set vertical radius to be atleast as high as height of div

radius = Math.min(radiusX, radiusY); // now set the radius of the circle equal to the minimum of the two values so that it is a perfect circle

context.arc(0, 0, radius, 0, 2*Math.PI, false); // use new radius to draw a brand new circle 

try using like this:

radius = Math.min(radiusX, radiusY);// here radiusX and radiusY will be currentDivWidth,currentDivHeight resp.

context.arc(0, 0, radius, 0, 2*Math.PI);

see a better description here: http://www.w3schools.com/tags/canvas_arc.asp

It appears you're letting the canvas resize based on its div container. That can introduce a problem.

If you resize the canvas's CSS using different percentages for width & height then the canvas content will distort--it will stretch.

To avoid distortion you must resize the canvas width & height proportionally (by the same percentage). The proportionally resized canvas will not necessarily fill the new div size as it did before.

An alternative:

Resize the canvas element itself & use the scaling transformation to redraw your content

This way you won't need to recalculate your circle's radius or position. You can use the exact same drawing commands that were originally used to draw your circle. The canvas's built-in scaling will do all the recalculations for you!

  1. Get a reference to your canvas & your div container and save the original div size

     var divcontainer=document.getElementById('mydiv'); var canvas=document.getElementById('mycanvas'); var context=canvas.getContext('2d'); var originalWidth=divcontainer.width; var originalHeight=divcontainer.height; 
  2. Resize the canvas element to the new div size.

     var newWidth=divcontainer.width; var newHeight=divcontainer.height; // Notes: // Resizing the canvas element will clear its content // This alternative allows the canvas to resize disproportionately canvas.width=newWidth; canvas.height=newHeight; 
  3. Use context scaling to automatically resize the canvas. Any redrawn content will scale automatically using the same original drawing commands.

     // calculate the scaling percentage necessary such that // new content will fit on the canvas var scaleFactor=Math.min((newWidth/originalWidth),(newHeight/originalHeight)); // scale the canvas context.scale(scaleFactor); // now redraw all content (your circle) using their original sizes & coordinates // unscale the canvas // (scaling is cumulative, so this cleans up for the next resizing) context.scale(-scaleFactor); 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM