使用 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 动画虚线的主要内容,如果未能解决你的问题,请参考以下文章

java如何调用本地打印机进行图片打印

Linux篇第十篇——动静态库(动静态库的介绍+动静态库的打包与使用)

Linux篇第十篇——动静态库(动静态库的介绍+动静态库的打包与使用)

JS动画之缓动函数分析及动画库

Pxer使用FFmpeg合成动图

41 Vue使用第三方动画库