使用Java绘制心形动画的代码示例

 更新时间:2025年06月12日 09:27:44   作者:ZacharyYaaaang  
Java动态爱心代码是一种简单而精美的动态效果,这篇文章主要介绍了使用Java绘制心形动画的代码示例,文中通过代码介绍的非常详细,需要的朋友可以参考下

代码说明

  • 动画原理

    • 使用Timer定期更新心形的缩放比例(scale变量)

    • 缩放比例在0.8到1.2之间循环变化,产生心跳效果

    • 每次缩放变化后调用repaint()重绘组件

  • 心形绘制

    • 使用Path2D类和贝塞尔曲线绘制心形

    • createHeart()方法创建心形路径

    • 通过改变size参数实现缩放效果

  • 视觉效果

    • 黑色背景衬托红色心形

    • 添加了半透明的红色发光效果增强视觉效果

    • 启用了抗锯齿使图形更平滑

运行方法

  • 将代码保存为HeartAnimation.java

  • 编译运行:javac HeartAnimation.java && java HeartAnimation

你将看到一个400x400的窗口,其中有一个跳动的红色心形

import javax.swing.*;
import java.awt.*;
import java.awt.geom.Path2D;
import java.util.ArrayList;
import java.util.Random;

public class Main extends JPanel {
    private float scale = 1.0f;
    private float delta = 0.01f;
    private final Color heartColor = new Color(255, 50, 50);
    private ArrayList<Particle> particles = new ArrayList<>();
    private Random random = new Random();

    public Main() {
        // 设置定时器来更新动画
        Timer timer = new Timer(30, e -> {
            scale += delta;

            // 改变缩放方向时产生粒子
            if (scale > 1.2f) {
                delta = -0.01f;
                createParticles();
            } else if (scale < 0.8f) {
                delta = 0.01f;
            }

            // 更新粒子
            updateParticles();
            repaint();
        });
        timer.start();
    }

    // 创建粒子
    private void createParticles() {
        int width = getWidth();
        int height = getHeight();
        int centerX = width / 2;
        int centerY = height / 2;
        int size = (int) (100 * scale);

        // 创建20-30个新粒子
        int particleCount = 20 + random.nextInt(10);
        for (int i = 0; i < particleCount; i++) {
            // 粒子从心形边缘发射
            double angle = random.nextDouble() * 2 * Math.PI;
            double distance = size * (0.5 + random.nextDouble() * 0.3);
            int x = centerX + (int)(distance * Math.cos(angle));
            int y = centerY + (int)(distance * Math.sin(angle) * 0.8);

            // 随机速度和颜色
            float speedX = (random.nextFloat() - 0.5f) * 3f;
            float speedY = (random.nextFloat() - 0.8f) * 3f;
            Color color = new Color(
                    255,
                    50 + random.nextInt(100),
                    50 + random.nextInt(100),
                    150 + random.nextInt(100)
            );

            particles.add(new Particle(x, y, speedX, speedY, color));
        }
    }

    // 更新粒子位置和生命周期
    private void updateParticles() {
        for (int i = particles.size() - 1; i >= 0; i--) {
            Particle p = particles.get(i);
            p.update();

            // 移除生命周期结束的粒子
            if (p.life <= 0) {
                particles.remove(i);
            }
        }
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;

        // 启用抗锯齿
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        int width = getWidth();
        int height = getHeight();

        // 设置渐变背景
        GradientPaint gradient = new GradientPaint(
                0, 0, new Color(10, 10, 30),
                width, height, new Color(30, 10, 50)
        );
        g2d.setPaint(gradient);
        g2d.fillRect(0, 0, width, height);

        // 先绘制粒子(在心形后面)
        for (Particle p : particles) {
            p.draw(g2d);
        }

        // 计算心形位置和大小
        int centerX = width / 2;
        int centerY = height / 2;
        int size = (int) (100 * scale);

        // 创建心形路径
        Path2D heart = createHeart(centerX, centerY, size);

        // 绘制心形
        g2d.setColor(heartColor);
        g2d.fill(heart);

        // 添加发光效果
        g2d.setColor(new Color(255, 100, 100, 100));
        for (int i = 1; i <= 5; i++) {
            Path2D glowHeart = createHeart(centerX, centerY, size + i * 3);
            g2d.fill(glowHeart);
        }
    }

    private Path2D createHeart(int centerX, int centerY, int size) {
        Path2D path = new Path2D.Double();

        // 心形贝塞尔曲线
        path.moveTo(centerX, centerY - size / 4);

        // 左半边心形
        path.curveTo(
                centerX - size / 2, centerY - size,
                centerX - size, centerY,
                centerX, centerY + size / 2
        );

        // 右半边心形
        path.curveTo(
                centerX + size, centerY,
                centerX + size / 2, centerY - size,
                centerX, centerY - size / 4
        );

        return path;
    }

    // 粒子类
    private class Particle {
        float x, y;
        float speedX, speedY;
        Color color;
        int life;
        float size;

        Particle(float x, float y, float speedX, float speedY, Color color) {
            this.x = x;
            this.y = y;
            this.speedX = speedX;
            this.speedY = speedY;
            this.color = color;
            this.life = 30 + random.nextInt(70); // 生命周期30-100帧
            this.size = 2 + random.nextFloat() * 3; // 大小2-5像素
        }

        void update() {
            x += speedX;
            y += speedY;
            speedY += 0.05f; // 重力效果
            life--;
            size *= 0.98f; // 逐渐缩小
        }

        void draw(Graphics2D g2d) {
            float alpha = (float)life / 100f; // 根据生命周期计算透明度
            if (alpha < 0) alpha = 0;
            if (alpha > 1) alpha = 1;

            g2d.setColor(new Color(
                    color.getRed(),
                    color.getGreen(),
                    color.getBlue(),
                    (int)(color.getAlpha() * alpha)
            ));

            g2d.fillOval((int)x, (int)y, (int)size, (int)size);
        }
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("带粒子效果的心形动画");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 500);
        frame.setLocationRelativeTo(null);

        Main animation = new Main();
        frame.add(animation);

        frame.setVisible(true);
    }
}

效果如图

总结 

到此这篇关于使用Java绘制心形动画的文章就介绍到这了,更多相关Java绘制心形动画内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • mybatis 查询返回Map<String,Object>类型

    mybatis 查询返回Map<String,Object>类型

    本文主要介绍了mybatis 查询返回Map<String,Object>类型,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • springboot中一些比较常用的注解总结

    springboot中一些比较常用的注解总结

    今天给大家带来的是关于Java的相关知识,文章围绕着springboot中一些比较常用的注解展开,文中有非常详细的总结,需要的朋友可以参考下
    2021-06-06
  • 解决Maven项目报错:failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0的问题

    解决Maven项目报错:failed to execute goal org.apache.maven.plug

    这篇文章主要介绍了解决Maven项目报错:failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • java实现验证码类生成中文验证码

    java实现验证码类生成中文验证码

    java实现的汉字输入验证码,主要包含两个类,一个是生成验证码,一个是判断验证码输入是否正确,实现原理非常简单,将汉字和干扰线生成图片并将汉字保存到session,前台获取每次生成验证码图片并用文本框值和session值比较,功能就怎么简单
    2014-01-01
  • Mybatis实现单个和批量定义别名typeAliases

    Mybatis实现单个和批量定义别名typeAliases

    这篇文章主要介绍了Mybatis实现单个和批量定义别名typeAliases,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 一文详解Java中的反射api

    一文详解Java中的反射api

    这篇文章主要为大家详细介绍了Java中的6个反射api,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以跟随小编一起学习一下
    2025-02-02
  • SpringBoot接入轻量级分布式日志框架(GrayLog)的操作方法

    SpringBoot接入轻量级分布式日志框架(GrayLog)的操作方法

    这篇文章主要介绍了SpringBoot接入轻量级分布式日志框架(GrayLog)的方法,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • Java中Integer两种转int方法比较

    Java中Integer两种转int方法比较

    本文主要介绍了Java Integer两种转int方法比较。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • java网上图书商城(2)Category模块

    java网上图书商城(2)Category模块

    这篇文章主要介绍了java网上图书商城,Category模块,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • 关于Java的动态代理机制

    关于Java的动态代理机制

    这篇文章主要介绍了关于Java的动态代理机制,动态代理就是,在程序运行期,创建目标对象的代理对象,并对目标对象中的方法进行功能性增强的一种技术,需要的朋友可以参考下
    2023-05-05

最新评论