Swing/RippleBorder の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/RippleBorder へ行く。
- Swing/RippleBorder の差分を削除
--- category: swing folder: RippleBorder title: Borderのアニメーション tags: [Border, Animation, Timer] author: aterai pubdate: 2006-05-29T09:06:51+09:00 description: Timerを使って、波紋風のアニメーションを描画するBorderを作成します。 image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTR9UHQaAI/AAAAAAAAAiA/_Kn7tNr8M3s/s800/RippleBorder.png --- * 概要 [#summary] `Timer`を使って、波紋風のアニメーションを描画する`Border`を作成します。 #download(https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTR9UHQaAI/AAAAAAAAAiA/_Kn7tNr8M3s/s800/RippleBorder.png) * サンプルコード [#sourcecode] #code(link){{ class RippleBorder extends EmptyBorder { private final Timer animator; private final JComponent comp; private float count = 1f; public RippleBorder(JComponent c, int width) { super(width, width, width, width); this.comp = c; animator = new Timer(80, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { comp.repaint(); count += .9f; } }); comp.addMouseListener(new MouseAdapter() { @Override public void mouseEntered(MouseEvent e) { comp.setForeground(Color.RED); animator.start(); } @Override public void mouseExited(MouseEvent e) { comp.setForeground(Color.BLACK); } }); } @Override public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { if (!animator.isRunning()) { super.paintBorder(c, g, x, y, w, h); return; } Graphics2D g2 = (Graphics2D) g; g2.setPaint(Color.WHITE); float a = 1f / count; if (.12f - a > 1.0e-2) { a = 0f; } g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, a)); Insets i = getBorderInsets(); int xx = i.left - (int) count; int yy = i.top - (int) count; int ww = i.left + i.right - (int) (count * 2f); int hh = i.top + i.bottom - (int) (count * 2f); g2.setStroke(new BasicStroke(count * 1.2f)); g2.drawRoundRect(xx, yy, w - ww, h - hh, 10, 10); if (xx < 0 && animator.isRunning()) { count = 1f; animator.stop(); } } } }} * 解説 [#explanation] 対象コンポーネント上にマウスカーソルが乗ったことをマウスリスナーで検知し、`Border`をアニメーションさせることで、波紋状の効果を描画しています。 対象コンポーネント上にマウスカーソルが乗ったことをマウスリスナーで検知し、`Border`をアニメーションさせることで波紋状の効果を描画しています。 * 参考リンク [#reference] - [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/border/EmptyBorder.html EmptyBorder (Java Platform SE 8)] * コメント [#comment] #comment #comment