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

📄 avatarchooser.java

📁 java动画
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
    }    private void initInputListeners() {        // input listeners are all stateless        // hence they can be instantiated once        focusGrabber = new FocusGrabber();        avatarScroller = new AvatarScroller();        cursorChanger = new CursorChanger();        wheelScroller = new MouseWheelScroller();        keyScroller = new KeyScroller();    }    private void removeInputListeners() {        removeMouseListener(focusGrabber);        removeMouseListener(avatarScroller);        removeMouseMotionListener(cursorChanger);        removeMouseWheelListener(wheelScroller);        removeKeyListener(keyScroller);    }    private void findAvatars() {        avatars = new ArrayList<Image>();        picturesFinder = new Thread(new PicturesFinderThread());        picturesFinder.start();    }    private void setAvatarIndex(int index) {        avatarIndex = index;        textAvatar = "Photo " + index;    }    private void scrollBy(int increment) {        if (loadingDone) {            setAvatarIndex(avatarIndex + increment);            if (avatarIndex < 0) {                setAvatarIndex(0);            } else if (avatarIndex >= avatars.size()) {                setAvatarIndex(avatars.size() - 1);            }            damaged = true;            repaint();        }    }        private void scrollAndAnimateBy(int increment) {        if (loadingDone && (scrollerTimer == null || !scrollerTimer.isRunning())) {            int index = avatarIndex + increment;            if (index < 0) {                index = 0;            } else if (index >= avatars.size()) {                index = avatars.size() - 1;            }                        DrawableAvatar drawable = null;            for (DrawableAvatar avatar: drawableAvatars) {                if (avatar.index == index) {                    drawable = avatar;                    break;                }            }            if (drawable != null) {                scrollAndAnimate(drawable);            }        }    }    private void scrollAndAnimate(DrawableAvatar avatar) {        if (loadingDone) {            scrollerTimer = new Timer(10, new AutoScroller(avatar));            scrollerTimer.start();        }    }    private BufferedImage createReflectedPicture(BufferedImage avatar) {        int avatarWidth = avatar.getWidth();        int avatarHeight = avatar.getHeight();        BufferedImage alphaMask = createGradientMask(avatarWidth, avatarHeight);        return createReflectedPicture(avatar, alphaMask);    }    private BufferedImage createReflectedPicture(BufferedImage avatar,                                                 BufferedImage alphaMask) {        int avatarWidth = avatar.getWidth();        int avatarHeight = avatar.getHeight();        BufferedImage buffer = createReflection(avatar,                                                avatarWidth, avatarHeight);        applyAlphaMask(buffer, alphaMask, avatarWidth, avatarHeight);        return buffer;    }    private void applyAlphaMask(BufferedImage buffer,                                BufferedImage alphaMask,                                int avatarWidth, int avatarHeight) {        Graphics2D g2 = buffer.createGraphics();        g2.setComposite(AlphaComposite.DstOut);        g2.drawImage(alphaMask, null, 0, avatarHeight);        g2.dispose();    }    private BufferedImage createReflection(BufferedImage avatar,                                           int avatarWidth,                                           int avatarHeight) {        BufferedImage buffer = new BufferedImage(avatarWidth, avatarHeight << 1,                                                 BufferedImage.TYPE_INT_ARGB);        Graphics2D g = buffer.createGraphics();        g.drawImage(avatar, null, null);        g.translate(0, avatarHeight << 1);        AffineTransform reflectTransform = AffineTransform.getScaleInstance(1.0, -1.0);        g.drawImage(avatar, reflectTransform, null);        g.translate(0, -(avatarHeight << 1));        g.dispose();        return buffer;    }    private BufferedImage createGradientMask(int avatarWidth, int avatarHeight) {        BufferedImage gradient = new BufferedImage(avatarWidth, avatarHeight,                                                   BufferedImage.TYPE_INT_ARGB);        Graphics2D g = gradient.createGraphics();        GradientPaint painter = new GradientPaint(0.0f, 0.0f,                                                  new Color(1.0f, 1.0f, 1.0f, 0.5f),                                                  0.0f, avatarHeight / 2.0f,                                                  new Color(1.0f, 1.0f, 1.0f, 1.0f));        g.setPaint(painter);        g.fill(new Rectangle2D.Double(0, 0, avatarWidth, avatarHeight));        g.dispose();        return gradient;    }    private DrawableAvatar getHitAvatar(int x, int y) {        for (DrawableAvatar avatar: drawableAvatars) {            Rectangle hit = new Rectangle((int) avatar.getX(), (int) avatar.getY(),                                          avatar.getWidth(), avatar.getHeight() / 2);            if (hit.contains(x, y)) {                return avatar;            }        }        return null;    }    private class PicturesFinderThread implements Runnable {        public void run() {            UnixGlobFileFilter allPngs = new UnixGlobFileFilter("*.jpg");            try {                FileTreeWalker walker = new FileTreeWalker(new File("./images"),                                                           allPngs);                PictureLoader loader = new PictureLoader();                walker.walk(loader);                List<File> files = loader.getFilesList();                for (int i = 0; i < files.size(); i++) {                    BufferedImage image = ImageIO.read(files.get(i));                    avatars.add(createReflectedPicture(image));                    if (i == (files.size() / 2) + avatarAmount / 2) {                        setAvatarIndex(i - avatarAmount / 2);                        startFader();                    }                }            } catch (IOException e) {            }            loadingDone = true;        }        private class PictureLoader implements FileTreeWalk {            private List<File> filesList;            private PictureLoader() {                filesList = new ArrayList<File>();            }                     private List<File> getFilesList() {                Collections.sort(filesList);                return filesList;            }            public void walk(File path) {                filesList.add(path);            }        }    }    private class FaderAction implements ActionListener {        private long start = 0;        private FaderAction() {            alphaLevel = 0.0f;            textAlphaLevel = 0.0f;        }        public void actionPerformed(ActionEvent e) {            if (start == 0) {                start = System.currentTimeMillis();            }            alphaLevel = (System.currentTimeMillis() - start) / 500.0f;            textAlphaLevel = alphaLevel;            if (alphaLevel > 1.0f) {                alphaLevel = 1.0f;                textAlphaLevel = 1.0f;                faderTimer.stop();            }            repaint();        }    }    private class DrawableAvatar implements Comparable {        private int index;        private double x;        private double y;        private int width;        private int height;        private double zOrder;        private double position;        private DrawableAvatar(int index,                               double x, double y, int width, int height,                               double position, double zOrder) {            this.index = index;            this.x = x;            this.y = y;            this.width = width;            this.height = height;            this.position = position;            this.zOrder = zOrder;        }        public int compareTo(Object o) {            double zOrder2 = ((DrawableAvatar) o).zOrder;            if (zOrder < zOrder2) {                return -1;            } else if (zOrder > zOrder2) {                return 1;            }            return 0;        }               public double getPosition() {            return position;        }        public double getAlpha() {            return zOrder * alphaLevel;        }        public int getHeight() {            return height;        }        public int getIndex() {            return index;        }        public int getWidth() {            return width;        }        public double getX() {            return x;        }        public double getY() {            return y;        }    }    private class MouseWheelScroller implements MouseWheelListener {        public void mouseWheelMoved(MouseWheelEvent e) {            int increment = e.getWheelRotation();            scrollAndAnimateBy(increment);        }    }    private class KeyScroller extends KeyAdapter {        @Override        public void keyPressed(KeyEvent e) {            int keyCode = e.getKeyCode();            switch (keyCode) {                case KeyEvent.VK_LEFT:                case KeyEvent.VK_UP:                    scrollAndAnimateBy(-1);                    break;                case KeyEvent.VK_RIGHT:                case KeyEvent.VK_DOWN:                    scrollAndAnimateBy(1);                    break;                case KeyEvent.VK_END:                    scrollBy(avatars.size() - avatarIndex - 1);                    break;                case KeyEvent.VK_HOME:                    scrollBy(-avatarIndex - 1);                    break;                case KeyEvent.VK_PAGE_UP:                    scrollAndAnimateBy(-avatarAmount / 2);                    break;                case KeyEvent.VK_PAGE_DOWN:                    scrollAndAnimateBy(avatarAmount / 2);                    break;            }        }    }    private class FocusGrabber extends MouseAdapter {        @Override        public void mouseClicked(MouseEvent e) {            requestFocus();        }    }    private class AvatarScroller extends MouseAdapter {        @Override        public void mouseClicked(MouseEvent e) {            if ((faderTimer != null && faderTimer.isRunning()) ||                (scrollerTimer != null && scrollerTimer.isRunning()) ||                drawableAvatars == null) {                return;            }            if (e.getButton() == MouseEvent.BUTTON1) {                DrawableAvatar avatar = getHitAvatar(e.getX(), e.getY());                if (avatar != null && avatar.getIndex() != avatarIndex) {                    scrollAndAnimate(avatar);                }            }        }    }    private class DamageManager extends ComponentAdapter {        @Override        public void componentResized(ComponentEvent e) {            damaged = true;        }    }    private class AutoScroller implements ActionListener {        private double position;        private int index;        private long start;        private AutoScroller(DrawableAvatar avatar) {            this.index = avatar.getIndex();            this.position = avatar.getPosition();            this.start = System.currentTimeMillis();        }        public void actionPerformed(ActionEvent e) {            long elapsed = System.currentTimeMillis() - start;            if (elapsed < ANIM_SCROLL_DELAY / 2.0) {                textAlphaLevel = (float) (1.0 - 2.0 * (elapsed / ANIM_SCROLL_DELAY));            } else {                textAlphaLevel = (float) (((elapsed / ANIM_SCROLL_DELAY) - 0.5) * 2.0);                if (textAlphaLevel > 1.0f) {                    textAlphaLevel = 1.0f;                }            }            if (textAlphaLevel < 0.1f) {                textAlphaLevel = 0.1f;                textAvatar = "LoginName" + index;            }            double newPosition = (elapsed / ANIM_SCROLL_DELAY) * -position;            if (elapsed >= ANIM_SCROLL_DELAY) {                ((Timer) e.getSource()).stop();                setAvatarIndex(index);                setPosition(0.0);                return;            }            setPosition(newPosition);        }    }    private class CursorChanger extends MouseMotionAdapter {        @Override        public void mouseMoved(MouseEvent e) {            if ((scrollerTimer != null && scrollerTimer.isRunning()) ||                drawableAvatars == null) {                return;            }            DrawableAvatar avatar = getHitAvatar(e.getX(), e.getY());            if (avatar != null) {                getParent().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));            } else {                getParent().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));            }        }    }}

⌨️ 快捷键说明

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