⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 avatarchooser.java

📁 JAVA图形特效,详细介绍SWING等的效果开发
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 2007, Romain Guy * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * *   * Redistributions of source code must retain the above copyright *     notice, this list of conditions and the following disclaimer. *   * Redistributions in binary form must reproduce the above *     copyright notice, this list of conditions and the following *     disclaimer in the documentation and/or other materials provided *     with the distribution. *   * Neither the name of the TimingFramework project nor the names of its *     contributors may be used to endorse or promote products derived *     from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */import java.awt.AlphaComposite;import java.awt.Color;import java.awt.Composite;import java.awt.Cursor;import java.awt.Dimension;import java.awt.Font;import java.awt.GradientPaint;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.GridBagConstraints;import java.awt.GridBagLayout;import java.awt.Image;import java.awt.Insets;import java.awt.Paint;import java.awt.Rectangle;import java.awt.RenderingHints;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.ComponentAdapter;import java.awt.event.ComponentEvent;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.event.MouseMotionAdapter;import java.awt.event.MouseWheelEvent;import java.awt.event.MouseWheelListener;import java.awt.font.FontRenderContext;import java.awt.font.TextLayout;import java.awt.geom.AffineTransform;import java.awt.geom.Area;import java.awt.geom.Ellipse2D;import java.awt.geom.Rectangle2D;import java.awt.geom.RoundRectangle2D;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.LinkedList;import java.util.List;import javax.imageio.ImageIO;import javax.swing.JPanel;import javax.swing.Timer;import io.FileTreeWalk;import io.FileTreeWalker;import io.UnixGlobFileFilter;public class AvatarChooser extends JPanel {    private static final double ANIM_SCROLL_DELAY = 450;    private List<Image> avatars = null;    private boolean loadingDone = false;    private Thread picturesFinder = null;    private Timer scrollerTimer = null;    private Timer faderTimer = null;    private Timer passwordTimer;    private float veilAlphaLevel = 0.0f;    private float alphaLevel = 0.0f;    private float textAlphaLevel = 0.0f;    private int avatarIndex;    private double avatarPosition = 0.0;    private double avatarSpacing = 0.4;    private int avatarAmount = 5;    private double sigma;    private double rho;    private double exp_multiplier;    private double exp_member;    private boolean damaged = true;    private DrawableAvatar[] drawableAvatars;    private String textAvatar;    private FocusGrabber focusGrabber;    private AvatarScroller avatarScroller;    private CursorChanger cursorChanger;    private MouseWheelScroller wheelScroller;    private KeyScroller keyScroller;    public AvatarChooser() {        GridBagLayout layout = new GridBagLayout();        setLayout(layout);        findAvatars();        setSigma(0.5);        addComponentListener(new DamageManager());        initInputListeners();        addInputListeners();    }    public void setAmount(int amount) {        if (amount > avatars.size()) {            throw new IllegalArgumentException("Too many avatars");        }        this.avatarAmount = amount;        repaint();    }    // XXX package access for debugging purpose only    void setPosition(double position) {        this.avatarPosition = position;        this.damaged = true;        repaint();    }    public void setSigma(double sigma) {        this.sigma = sigma;        this.rho = 1.0;        computeEquationParts();        this.rho = computeModifierUnprotected(0.0);        computeEquationParts();        this.damaged = true;        repaint();    }    public void setSpacing(double avatarSpacing) {        if (avatarSpacing < 0.0 || avatarSpacing > 1.0) {            throw new IllegalArgumentException("Spacing must be < 1.0 and > 0.0");        }        this.avatarSpacing = avatarSpacing;        this.damaged = true;        repaint();    }    @Override    public Dimension getPreferredSize() {        return new Dimension(128 * 3, 128 * 2);    }    @Override    public Dimension getMaximumSize() {        return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);    }    @Override    public boolean isOpaque() {        return false;    }    @Override    public boolean isFocusable() {        return true;    }    @Override    protected void paintChildren(Graphics g) {        Graphics2D g2 = (Graphics2D) g;        Composite oldComposite = g2.getComposite();        g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,                                                   veilAlphaLevel));        super.paintChildren(g);        g2.setComposite(oldComposite);    }    @Override    protected void paintComponent(Graphics g) {        super.paintComponent(g);        if (!loadingDone && faderTimer == null) {            return;        }        Insets insets = getInsets();        int x = insets.left;        int y = insets.top;        int width = getWidth() - insets.left - insets.right;        int height = getHeight() - insets.top - insets.bottom;        Graphics2D g2 = (Graphics2D) g;        g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,                            RenderingHints.VALUE_INTERPOLATION_BILINEAR);        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,                            RenderingHints.VALUE_ANTIALIAS_ON);        Composite oldComposite = g2.getComposite();        if (damaged) {            drawableAvatars = sortAvatarsByDepth(x, y, width, height);            damaged = false;        }        drawAvatars(g2, drawableAvatars);        if (drawableAvatars.length > 0) {            drawAvatarName(g2);        }        g2.setComposite(oldComposite);    }    private void drawAvatars(Graphics2D g2, DrawableAvatar[] drawableAvatars) {        for (DrawableAvatar avatar: drawableAvatars) {            AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER,                                                                   (float) avatar.getAlpha());            g2.setComposite(composite);            g2.drawImage(avatars.get(avatar.getIndex()),                         (int) avatar.getX(), (int) avatar.getY(),                         avatar.getWidth(), avatar.getHeight(), null);        }    }    private DrawableAvatar[] sortAvatarsByDepth(int x, int y,                                                int width, int height) {        List<DrawableAvatar> drawables = new LinkedList<DrawableAvatar>();        for (int i = 0; i < avatars.size(); i++) {            promoteAvatarToDrawable(drawables,                                    x, y, width, height, i - avatarIndex);        }        DrawableAvatar[] drawableAvatars = new DrawableAvatar[drawables.size()];        drawableAvatars = drawables.toArray(drawableAvatars);        Arrays.sort(drawableAvatars);        return drawableAvatars;    }    private void drawAvatarName(Graphics2D g2) {        Composite composite = g2.getComposite();        g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,                                                   textAlphaLevel));        double bulletWidth = 150.0;        double bulletHeight = 30.0;        double x = (getWidth() - bulletWidth) / 2.0;        double y = (getHeight() - 164) / 2.0 - bulletHeight * 1.4;        drawAvatarBullet(g2, x, y, bulletWidth, bulletHeight);        drawAvatarText(g2, y, bulletHeight);        g2.setComposite(composite);    }    private void drawAvatarText(Graphics2D g2, double y, double bulletHeight) {        FontRenderContext context = g2.getFontRenderContext();        Font font = new Font("Dialog", Font.PLAIN, 18);        TextLayout layout = new TextLayout(textAvatar, font, context);        Rectangle2D bounds = layout.getBounds();        float text_x = (float) ((getWidth() - bounds.getWidth()) / 2.0);        float text_y = (float) (y + (bulletHeight - layout.getAscent() -                                      layout.getDescent()) / 2.0) +                                     layout.getAscent() - layout.getLeading();        g2.setColor(Color.BLACK);        layout.draw(g2, text_x, text_y + 1);        g2.setColor(Color.WHITE);        layout.draw(g2, text_x, text_y);    }    private void drawAvatarBullet(Graphics2D g2,                                  double x, double y,                                  double bulletWidth, double bulletHeight) {        RoundRectangle2D bullet = new RoundRectangle2D.Double(0.0, 0.0,                                                              bulletWidth, bulletHeight,                                                              bulletHeight, bulletHeight);        Ellipse2D curve = new Ellipse2D.Double(-20.0, bulletHeight / 2.0,                                               bulletWidth + 40.0, bulletHeight);        g2.translate(x, y);        g2.translate(-1, -2);        g2.setColor(new Color(0, 0, 0, 170));        g2.fill(new RoundRectangle2D.Double(0.0, 0.0,                                            bulletWidth + 2, bulletHeight + 4,                                            bulletHeight + 4, bulletHeight + 4));        g2.translate(1, 2);        Color startColor = new Color(10, 0, 40);        Color endColor = new Color(175, 165, 225);        Paint paint = g2.getPaint();        g2.setPaint(new GradientPaint(0.0f, 0.0f, startColor,                                      0.0f, (float) bulletHeight, endColor));        g2.fill(bullet);        startColor = new Color(5, 0, 50);        endColor = new Color(105, 100, 155);        g2.setPaint(new GradientPaint(0.0f, 0.0f, startColor,                                      0.0f, (float) bulletHeight, endColor));        Area area = new Area(bullet);        area.intersect(new Area(curve));        g2.fill(area);        g2.setPaint(paint);        g2.translate(-x, -y);    }    private void promoteAvatarToDrawable(List<DrawableAvatar> drawables,                                         int x, int y, int width, int height,                                         int offset) {        double spacing = offset * avatarSpacing;        double avatarPosition = this.avatarPosition + spacing;        if (avatarIndex + offset < 0 ||            avatarIndex + offset >= avatars.size()) {            return;        }        Image avatar = avatars.get(avatarIndex + offset);        int avatarWidth = avatar.getWidth(null);        int avatarHeight = avatar.getHeight(null);        double result = computeModifier(avatarPosition);        int newWidth = (int) (avatarWidth * result);        if (newWidth == 0) {            return;        }        int newHeight = (int) (avatarHeight * result);        if (newHeight == 0) {            return;        }        double avatar_x = x + (width - newWidth) / 2.0;        double avatar_y = y + (height - newHeight / 2.0) / 2.0;        double semiWidth = width / 2.0;        avatar_x += avatarPosition * semiWidth;        if (avatar_x >= width || avatar_x < -newWidth) {            return;        }        drawables.add(new DrawableAvatar(avatarIndex + offset,                                         avatar_x, avatar_y,                                         newWidth, newHeight,                                         avatarPosition, result));    }    private void startFader() {        faderTimer = new Timer(35, new FaderAction());        faderTimer.start();    }        private void computeEquationParts() {        exp_multiplier = Math.sqrt(2.0 * Math.PI) / sigma / rho;        exp_member = 4.0 * sigma * sigma;    }    // XXX package access for debug purpose only    double computeModifier(double x) {        double result = computeModifierUnprotected(x);        if (result > 1.0) {            result = 1.0;        } else if (result < -1.0) {            result = -1.0;        }        return result;    }    private double computeModifierUnprotected(double x) {        return exp_multiplier * Math.exp((-x * x) / exp_member);    }    private void addInputListeners() {        addMouseListener(focusGrabber);        addMouseListener(avatarScroller);        addMouseMotionListener(cursorChanger);        addMouseWheelListener(wheelScroller);        addKeyListener(keyScroller);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -