Path: blob/master/src/demo/share/jfc/J2Ddemo/java2d/demos/Mix/BezierScroller.java
41175 views
/*1*2* Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.3*4* Redistribution and use in source and binary forms, with or without5* modification, are permitted provided that the following conditions6* are met:7*8* - Redistributions of source code must retain the above copyright9* notice, this list of conditions and the following disclaimer.10*11* - Redistributions in binary form must reproduce the above copyright12* notice, this list of conditions and the following disclaimer in the13* documentation and/or other materials provided with the distribution.14*15* - Neither the name of Oracle nor the names of its16* contributors may be used to endorse or promote products derived17* from this software without specific prior written permission.18*19* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS20* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,21* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR22* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR23* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,24* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,25* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR26* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF27* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING28* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS29* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.30*/31package java2d.demos.Mix;323334import static java.awt.Color.LIGHT_GRAY;35import static java.awt.Color.WHITE;36import static java.lang.Math.random;37import java.awt.AlphaComposite;38import java.awt.BasicStroke;39import java.awt.Color;40import java.awt.Component;41import java.awt.Dimension;42import java.awt.Font;43import java.awt.FontMetrics;44import java.awt.Graphics2D;45import java.awt.Image;46import java.awt.RenderingHints;47import java.awt.event.ActionEvent;48import java.awt.event.ActionListener;49import java.awt.geom.GeneralPath;50import java.awt.geom.Path2D;51import java.awt.geom.PathIterator;52import java.awt.image.BufferedImage;53import java.io.BufferedReader;54import java.io.FileReader;55import java.util.ArrayList;56import java.util.List;57import java.util.logging.Level;58import java.util.logging.Logger;59import java2d.AnimatingControlsSurface;60import java2d.CustomControls;61import javax.swing.AbstractButton;62import javax.swing.JToggleButton;63import javax.swing.JToolBar;646566/**67* Animated Bezier Curve shape with images at the control points.68* README.txt file scrolling up. Composited Image fading in and out.69*/70@SuppressWarnings("serial")71public class BezierScroller extends AnimatingControlsSurface {7273private static String[] appletStrs = { " ", "J2Ddemo",74"BezierScroller - Animated Bezier Curve shape with images",75"For README.txt file scrolling run in application mode", " " };76private static final int NUMPTS = 6;77private static Color greenBlend = new Color(0, 255, 0, 100);78private static Color blueBlend = new Color(0, 0, 255, 100);79private static Font font = new Font(Font.SERIF, Font.PLAIN, 12);80private static BasicStroke bs = new BasicStroke(3.0f);81private static Image hotj_img;82private static BufferedImage img;83private static final int UP = 0;84private static final int DOWN = 1;85private float[] animpts = new float[NUMPTS * 2];86private float[] deltas = new float[NUMPTS * 2];87private BufferedReader reader;88private int nStrs;89private int strH;90private int yy, ix, iy, imgX;91private List<String> vector, appletVector;92private float alpha = 0.2f;93private int alphaDirection;94protected boolean doImage, doShape, doText;95protected boolean buttonToggle;9697/*98* Using this to scale down globe.png since we want a smaller version,99* I know it is 100 x 160 and has a transparent pixel.100*/101private Image scaled(Image src) {102int sw = src.getWidth(null);103int sh = src.getHeight(null);104int dw = sw/5;105int dh = sh/5;106BufferedImage bi =107new BufferedImage(dw, dh, BufferedImage.TYPE_INT_ARGB);108Graphics2D g2d = bi.createGraphics();109g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,110RenderingHints.VALUE_INTERPOLATION_BICUBIC);111g2d.drawImage(src, 0, 0, dw, dh, 0, 0, sw, sh, null);112g2d.dispose();113return bi;114}115116@SuppressWarnings("LeakingThisInConstructor")117public BezierScroller() {118setBackground(WHITE);119doShape = doText = true;120hotj_img = scaled(getImage("globe.png"));121Image image = getImage("jumptojavastrip.png");122int iw = image.getWidth(this);123int ih = image.getHeight(this);124img = new BufferedImage(iw, ih, BufferedImage.TYPE_INT_RGB);125img.createGraphics().drawImage(image, 0, 0, this);126setControls(new Component[] { new DemoControls(this) });127}128129public void animate(float[] pts, float[] deltas, int index, int limit) {130float newpt = pts[index] + deltas[index];131if (newpt <= 0) {132newpt = -newpt;133deltas[index] = (float) (random() * 4.0 + 2.0);134} else if (newpt >= limit) {135newpt = 2.0f * limit - newpt;136deltas[index] = -(float) (random() * 4.0 + 2.0);137}138pts[index] = newpt;139}140141public void getFile() {142try {143String fName = "README.txt";144if ((reader = new BufferedReader(new FileReader(fName))) != null) {145getLine();146}147} catch (Exception e) {148reader = null;149}150if (reader == null) {151appletVector = new ArrayList<String>(100);152for (int i = 0; i < 100; i++) {153appletVector.add(appletStrs[i % appletStrs.length]);154}155getLine();156}157buttonToggle = true;158}159160public String getLine() {161String str = null;162if (reader != null) {163try {164if ((str = reader.readLine()) != null) {165if (str.length() == 0) {166str = " ";167}168vector.add(str);169}170} catch (Exception e) {171Logger.getLogger(BezierScroller.class.getName()).log(172Level.SEVERE,173null, e);174reader = null;175}176} else {177if (!appletVector.isEmpty()) {178vector.add(str = appletVector.remove(0));179}180}181return str;182}183184@Override185public void reset(int w, int h) {186for (int i = 0; i < animpts.length; i += 2) {187animpts[i + 0] = (float) (random() * w);188animpts[i + 1] = (float) (random() * h);189deltas[i + 0] = (float) (random() * 6.0 + 4.0);190deltas[i + 1] = (float) (random() * 6.0 + 4.0);191if (animpts[i + 0] > w / 2.0f) {192deltas[i + 0] = -deltas[i + 0];193}194if (animpts[i + 1] > h / 2.0f) {195deltas[i + 1] = -deltas[i + 1];196}197}198FontMetrics fm = getFontMetrics(font);199strH = fm.getAscent() + fm.getDescent();200nStrs = h / strH + 2;201vector = new ArrayList<String>(nStrs);202ix = (int) (random() * (w - 80));203iy = (int) (random() * (h - 80));204}205206@Override207public void step(int w, int h) {208if (doText && vector.isEmpty()) {209getFile();210}211if (doText) {212String s = getLine();213if (s == null || vector.size() == nStrs && !vector.isEmpty()) {214vector.remove(0);215}216yy = (s == null) ? 0 : h - vector.size() * strH;217}218219for (int i = 0; i < animpts.length && doShape; i += 2) {220animate(animpts, deltas, i + 0, w);221animate(animpts, deltas, i + 1, h);222}223if (doImage && alphaDirection == UP) {224if ((alpha += 0.025) > .99) {225alphaDirection = DOWN;226alpha = 1.0f;227}228} else if (doImage && alphaDirection == DOWN) {229if ((alpha -= .02) < 0.01) {230alphaDirection = UP;231alpha = 0;232ix = (int) (random() * (w - 80));233iy = (int) (random() * (h - 80));234}235}236if (doImage) {237if ((imgX += 80) == 800) {238imgX = 0;239}240}241}242243@Override244public void render(int w, int h, Graphics2D g2) {245246if (doText) {247g2.setColor(LIGHT_GRAY);248g2.setFont(font);249float y = yy;250//for (int i = 0; i < vector.size(); i++) {251for (String string : vector) {252g2.drawString(string, 1, y += strH);253}254}255256if (doShape) {257float[] ctrlpts = animpts;258int len = ctrlpts.length;259float prevx = ctrlpts[len - 2];260float prevy = ctrlpts[len - 1];261float curx = ctrlpts[0];262float cury = ctrlpts[1];263float midx = (curx + prevx) / 2.0f;264float midy = (cury + prevy) / 2.0f;265GeneralPath gp = new GeneralPath(Path2D.WIND_NON_ZERO);266gp.moveTo(midx, midy);267for (int i = 2; i <= ctrlpts.length; i += 2) {268float x1 = (midx + curx) / 2.0f;269float y1 = (midy + cury) / 2.0f;270prevx = curx;271prevy = cury;272if (i < ctrlpts.length) {273curx = ctrlpts[i + 0];274cury = ctrlpts[i + 1];275} else {276curx = ctrlpts[0];277cury = ctrlpts[1];278}279midx = (curx + prevx) / 2.0f;280midy = (cury + prevy) / 2.0f;281float x2 = (prevx + midx) / 2.0f;282float y2 = (prevy + midy) / 2.0f;283gp.curveTo(x1, y1, x2, y2, midx, midy);284}285gp.closePath();286287g2.setColor(blueBlend);288g2.setStroke(bs);289g2.draw(gp);290g2.setColor(greenBlend);291g2.fill(gp);292293PathIterator pi = gp.getPathIterator(null);294float[] pts = new float[6];295while (!pi.isDone()) {296if (pi.currentSegment(pts) == PathIterator.SEG_CUBICTO) {297g2.drawImage(hotj_img, (int) pts[0], (int) pts[1], this);298}299pi.next();300}301}302303if (doImage) {304AlphaComposite ac = AlphaComposite.getInstance(305AlphaComposite.SRC_OVER, alpha);306g2.setComposite(ac);307g2.drawImage(img.getSubimage(imgX, 0, 80, 80), ix, iy, this);308}309}310311public static void main(String[] argv) {312createDemoFrame(new BezierScroller());313}314315316static final class DemoControls extends CustomControls implements317ActionListener {318319BezierScroller demo;320JToolBar toolbar;321322public DemoControls(BezierScroller demo) {323super(demo.name);324this.demo = demo;325add(toolbar = new JToolBar());326toolbar.setFloatable(false);327addTool("Image", false);328addTool("Shape", true);329addTool("Text", true);330}331332public void addTool(String str, boolean state) {333JToggleButton b =334(JToggleButton) toolbar.add(new JToggleButton(str));335b.setFocusPainted(false);336b.setSelected(state);337b.addActionListener(this);338int width = b.getPreferredSize().width;339Dimension prefSize = new Dimension(width, 21);340b.setPreferredSize(prefSize);341b.setMaximumSize(prefSize);342b.setMinimumSize(prefSize);343}344345@Override346public void actionPerformed(ActionEvent e) {347JToggleButton b = (JToggleButton) e.getSource();348if (b.getText().equals("Image")) {349demo.doImage = b.isSelected();350} else if (b.getText().equals("Shape")) {351demo.doShape = b.isSelected();352} else {353demo.doText = b.isSelected();354}355if (!demo.animating.running()) {356demo.repaint();357}358}359360@Override361public Dimension getPreferredSize() {362return new Dimension(200, 40);363}364365@Override366@SuppressWarnings("SleepWhileHoldingLock")367public void run() {368Thread me = Thread.currentThread();369int i = 0;370while (thread == me) {371try {372Thread.sleep(250);373} catch (InterruptedException e) {374return;375}376if (demo.buttonToggle) {377((AbstractButton) toolbar.getComponentAtIndex(i++ % 2)).378doClick();379demo.buttonToggle = false;380}381}382thread = null;383}384} // End DemoControls385} // End BezierScroller386387388389