Анимация пунктирной линии с помощью java.awt.BasicStroke
Есть ли способ создать анимированную пунктирную линию с помощью BasicStroke из java.awt? Мое желание состоит в том, чтобы иметь бегущую пунктирную линию таким же образом, что и инструмент прямоугольного маркера Photoshop, который анимирован.
- Что означает PorterDuff.Mode в графике Android. Что он делает?
- Закругленные края в кнопке C # (WinForms)
- Вращение нескольких изображений, вызывающих мерцание. Java Graphics2D
- CubicCurve JavaFX
- Полностью удалить метки facet_wrap
- как создать линию произвольной толщины с помощью Bresenham?
- Изменение матрицы от правой до левой системы координат
- В MATLAB, как я рисую изображение и сохраняю результат без его отображения?
Используйте пунктирную линию, 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); } }); } }