You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Swing实现眨眼动画:外层圆形收缩时如何裁剪隐藏内层圆形

Java Swing 眨眼动画角膜裁剪实现方案

核心方案使用Swing Graphics2D自带的形状裁剪能力,无需修改角膜本身的大小参数,即可实现超出巩膜边界的内容自动隐藏,完全匹配你期望的类似JPanel裁剪内部组件的效果。

具体修改步骤

  1. 先在Eye类的导入部分添加Ellipse2D的引用:
import java.awt.geom.Ellipse2D;
  1. 修改Eye类的draw方法,在绘制角膜前后增加裁剪逻辑:
public void draw (Graphics g) {
    Graphics2D g2d = (Graphics2D) g;

    //eyelid
    g2d.setColor(Color.pink);
    g2d.fillOval(lidX, lidY, lidDiameter, lidDiameter);

    //sclera
    g2d.setColor(Color.white);
    g2d.fillOval(sclX, sclU, sclDiameter, sclB);

    g2d.setColor(Color.black);
    g2d.drawLine(sclX, sclC, sclX + sclDiameter, sclC);

    // --- 新增裁剪逻辑开始 ---
    // 保存当前默认的裁剪区域
    Shape originalClip = g2d.getClip();
    // 将裁剪区域设置为当前巩膜的可见椭圆范围
    g2d.setClip(new Ellipse2D.Double(sclX, sclU, sclDiameter, sclB));
    // --- 新增裁剪逻辑结束 ---

    //cornea
    g2d.setColor(Color.cyan);
    // 角膜保持原始尺寸、坐标不变,无需修改corU、corB参数
    g2d.fillOval(corX, corY, corDiameter, corDiameter);

    g2d.setColor(Color.red);
    g2d.drawLine(corX, corC, corX + corDiameter, corC);

    // --- 新增恢复裁剪逻辑 ---
    g2d.setClip(originalClip);
    // --- 新增恢复裁剪逻辑结束 ---

    //trigger blink
    blink();
}
  1. 可以删除原代码中同步修改corU、corB的相关逻辑,角膜参数保持初始值即可。

修改后眨眼时,巩膜收缩的过程中,角膜超出巩膜边界的部分会自动被裁剪隐藏,不会出现挤压变形的问题。

内容的提问来源于stack exchange,提问作者Damien

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 19:45:02