使用 java.awt.BasicStroke 动画虚线
Posted
技术标签:
【中文标题】使用 java.awt.BasicStroke 动画虚线【英文标题】:Animating dashed-line with java.awt.BasicStroke 【发布时间】:2012-04-04 01:00:20 【问题描述】:有没有办法使用 java.awt 中的 BasicStroke 生成动画虚线?我的愿望是有一条连续的虚线,就像 Photoshop 的矩形选框工具让它的线条动画一样。
【问题讨论】:
如果您可以生成虚线,Thread
(或 Swing Timer
)结合 repaint()
以及对破折号开始和结束位置的一些调整 - 应该可以实现。跨度>
@AndrewThompson:BasicStroke
类具有可用于此目的的破折号阶段属性。
@lhballoti Aah,dashPhase
- 好电话。
【参考方案1】:
使用虚线、Thread
(或 Swing Timer
)并将它们与repaint()
结合起来,并对破折号的开始和结束位置进行一些调整 - 就可以了。
示例
package test;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
public class AnimatedStroke
public static void main(String[] args)
SwingUtilities.invokeLater(new Runnable()
public void run()
BasicStroke dashedStroke;
final int width = 100;
final int height = 30;
final BufferedImage image = new BufferedImage(
width,height,BufferedImage.TYPE_INT_ARGB);
final JLabel label = new JLabel(new ImageIcon(image));
int pad = 5;
final Shape rectangle = new Rectangle2D.Double(
(double)pad,(double)pad,
(double)(width-2*pad),
(double)(height-2*pad));
ActionListener listener = new ActionListener()
float dashPhase = 0f;
float dash[] = 5.0f,5.0f;
@Override
public void actionPerformed(ActionEvent ae)
dashPhase += 9.0f;
BasicStroke dashedStroke = new BasicStroke(
1.5f,
BasicStroke.CAP_ROUND,
BasicStroke.JOIN_MITER,
1.5f, //miter limit
dash,
dashPhase
);
Graphics2D g = image.createGraphics();
g.setColor(Color.WHITE);
g.fillRect(0,0,width,height);
g.setColor(Color.BLACK);
g.setStroke(dashedStroke);
g.draw(rectangle);
g.dispose();
label.repaint();
/*
if (dashPhase<100f)
try
ImageIO.write(
image,
"PNG",
new File("img" + dashPhase + ".png"));
catch(IOException ioe)
// we tried
*/
;
Timer timer = new Timer(40, listener);
timer.start();
JOptionPane.showMessageDialog(null, label);
);
【讨论】:
@trashgod 很高兴知道一个非常知名的动画边框的通用名称/历史。并且喜欢这个名字 - 蚂蚁真是太神奇了(放牧,农业,建造复杂的结构...... - 我只是希望他们不会很快在他们的工具包中获得“火”)。 ;) Java 7 有一个StrokeBorder。到时候你就不用自己画了。以上是关于使用 java.awt.BasicStroke 动画虚线的主要内容,如果未能解决你的问题,请参考以下文章
Linux篇第十篇——动静态库(动静态库的介绍+动静态库的打包与使用)