topical media & game development

talk show tell print

#javascript-processing-example-topic-gui-scrollbar.htm / htm



  <!DOCTYPE html>
  <html><head>
  <script src="javascript-processing-example-processing.js"></script>
  <script src="javascript-processing-example-init.js"></script>
  <link rel="stylesheet" href="javascript-processing-example-style.css">
  </head><body><h1><a href="http://ejohn.org/blog/processingjs/">Processing.js</a></h1>
  <h2>Scrollbar</h2>
  
  <p>Move the scrollbars left and right to change the positions of the images.</p>
  
  <p><a href="http://processing.org/learning/topics/scrollbar.html"><b>Original Processing.org Example:</b> Scrollbar</a><br>
  <script type="application/processing">
  HScrollbar hs1, hs2;
  
  PImage top, bottom;         // Two image to load
  int topWidth, bottomWidth;  // The width of the top and bottom images
  
  void setup()
  {
    size(200, 200);
    noStroke();
    hs1 = new HScrollbar(0, 20, width, 10, 3*5+1);
    hs2 = new HScrollbar(0, height-20, width, 10, 3*5+1);
    top = loadImage("seedTop.jpg");
    topWidth = top.width;
    bottom = loadImage("seedBottom.jpg");
    bottomWidth = bottom.width;
  }
  
  void draw()
  {
    background(255);
    
    // Get the position of the top scrollbar
    // and convert to a value to display the top image 
    float topPos = hs1.getPos()-width/2;
    fill(255);
    image(top, width/2-topWidth/2 + topPos*2, 0);
    
    // Get the position of the bottom scrollbar
    // and convert to a value to display the bottom image
    float bottomPos = hs2.getPos()-width/2;
    fill(255);
    image(bottom, width/2-bottomWidth/2 + bottomPos*2, height/2);
   
    hs1.update();
    hs2.update();
    hs1.display();
    hs2.display();
  }
  
  class HScrollbar
  {
    int swidth, sheight;    // width and height of bar
    int xpos, ypos;         // x and y position of bar
    float spos, newspos;    // x position of slider
    int sposMin, sposMax;   // max and min values of slider
    int loose;              // how loose/heavy
    boolean isOver;           // is the mouse over the slider?
    boolean locked;
    float ratio;
  
    HScrollbar (int xp, int yp, int sw, int sh, int l) {
      swidth = sw;
      sheight = sh;
      int widthtoheight = sw - sh;
      ratio = (float)sw / (float)widthtoheight;
      xpos = xp;
      ypos = yp-sheight/2;
      spos = xpos + swidth/2 - sheight/2;
      newspos = spos;
      sposMin = xpos;
      sposMax = xpos + swidth - sheight;
      loose = l;
    }
  
    void update() {
      if(over()) {
        isOver = true;
      } else {
        isOver = false;
      }
      if(mousePressed && isOver) {
        locked = true;
      }
      if(!mousePressed) {
        locked = false;
      }
      if(locked) {
        newspos = constrain(mouseX-sheight/2, sposMin, sposMax);
      }
      if(abs(newspos - spos) > 1) {
        spos = spos + (newspos-spos)/loose;
      }
    }
  
    int constrain(int val, int minv, int maxv) {
      return min(max(val, minv), maxv);
    }
  
    boolean over() {
      if(mouseX > xpos && mouseX < xpos+swidth &&
      mouseY > ypos && mouseY < ypos+sheight) {
        return true;
      } else {
        return false;
      }
    }
  
    void display() {
      fill(255);
      rect(xpos, ypos, swidth, sheight);
      if(isOver || locked) {
        fill(153, 102, 0);
      } else {
        fill(102, 102, 102);
      }
      rect(spos, ypos, sheight, sheight);
    }
  
    float getPos() {
      // Convert spos to be values between
      // 0 and the total width of the scrollbar
      return spos * ratio;
    }
  }
  </script><canvas width="200" height="200"></canvas></p>
  <div style="overflow: hidden; height: 0px; width: 0px;"><img src="javascript-processing-example-seedBottom.jpg" id="seedBottom.jpg"><img src="javascript-processing-example-seedTop.jpg" id="seedTop.jpg"></div>
  
  <pre><b>// All Examples Written by <a href="http://reas.com/">Casey Reas</a> and <a href="http://benfry.com/">Ben Fry</a>
  // unless otherwise stated.</b>
  HScrollbar hs1, hs2;
  
  PImage top, bottom;         // Two image to load
  int topWidth, bottomWidth;  // The width of the top and bottom images
  
  void setup()
  {
    size(200, 200);
    noStroke();
    hs1 = new HScrollbar(0, 20, width, 10, 3*5+1);
    hs2 = new HScrollbar(0, height-20, width, 10, 3*5+1);
    top = loadImage("seedTop.jpg");
    topWidth = top.width;
    bottom = loadImage("seedBottom.jpg");
    bottomWidth = bottom.width;
  }
  
  void draw()
  {
    background(255);
    
    // Get the position of the top scrollbar
    // and convert to a value to display the top image 
    float topPos = hs1.getPos()-width/2;
    fill(255);
    image(top, width/2-topWidth/2 + topPos*2, 0);
    
    // Get the position of the bottom scrollbar
    // and convert to a value to display the bottom image
    float bottomPos = hs2.getPos()-width/2;
    fill(255);
    image(bottom, width/2-bottomWidth/2 + bottomPos*2, height/2);
   
    hs1.update();
    hs2.update();
    hs1.display();
    hs2.display();
  }
  
  class HScrollbar
  {
    int swidth, sheight;    // width and height of bar
    int xpos, ypos;         // x and y position of bar
    float spos, newspos;    // x position of slider
    int sposMin, sposMax;   // max and min values of slider
    int loose;              // how loose/heavy
    boolean over;           // is the mouse over the slider?
    boolean locked;
    float ratio;
  
    HScrollbar (int xp, int yp, int sw, int sh, int l) {
      swidth = sw;
      sheight = sh;
      int widthtoheight = sw - sh;
      ratio = (float)sw / (float)widthtoheight;
      xpos = xp;
      ypos = yp-sheight/2;
      spos = xpos + swidth/2 - sheight/2;
      newspos = spos;
      sposMin = xpos;
      sposMax = xpos + swidth - sheight;
      loose = l;
    }
  
    void update() {
      if(over()) {
        over = true;
      } else {
        over = false;
      }
      if(mousePressed &amp;&amp; over) {
        locked = true;
      }
      if(!mousePressed) {
        locked = false;
      }
      if(locked) {
        newspos = constrain(mouseX-sheight/2, sposMin, sposMax);
      }
      if(abs(newspos - spos) &gt; 1) {
        spos = spos + (newspos-spos)/loose;
      }
    }
  
    int constrain(int val, int minv, int maxv) {
      return min(max(val, minv), maxv);
    }
  
    boolean over() {
      if(mouseX &gt; xpos &amp;&amp; mouseX &lt; xpos+swidth &amp;&amp;
      mouseY &gt; ypos &amp;&amp; mouseY &lt; ypos+sheight) {
        return true;
      } else {
        return false;
      }
    }
  
    void display() {
      fill(255);
      rect(xpos, ypos, swidth, sheight);
      if(over || locked) {
        fill(153, 102, 0);
      } else {
        fill(102, 102, 102);
      }
      rect(spos, ypos, sheight, sheight);
    }
  
    float getPos() {
      // Convert spos to be values between
      // 0 and the total width of the scrollbar
      return spos * ratio;
    }
  }</pre>
  </body></html>
  


(C) Æliens 20/2/2008

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.