Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 365|回复: 0

[Swing学习]java Swing眨眼睛动画

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-12 23:57:15 | 显示全部楼层 |阅读模式
    效果图:

    /**
    * 注意事项:
    * 1、本程序为java程序,同时感谢您花费宝贵的时间来阅读本文档;
    * 2、请注意包名为:practice,文件名为:EyesJFrame,注意检查,以防一些不必要的麻烦;
    * 3、在完成确认2中的内容后,本程序可以直接运行,因为本软件说明都在注释中;
    * 4、由于本例子是继《动态中国太极图――Java原创》后编写,所以在那里面已说明的东西,不再详述,
    * 同时由于个人能力、阅历等原因,有些细节可能并没有详细阐述,或者有疏漏,请谅解。
    * 5、您可以注释paint()方法中的一些代码,因为效果很直观,也许这样您理解得更快,建议如下:
    * 5.1 先看paint()方法第1条语句效果,把paint()方法中的其它语句注释掉;
    * 5.2 再看paint()方法第1、2条语句效果,把paint()方法中的其它语句注释掉;
    * 5.3 再看paint()方法第1、2、3条语句效果,把paint()方法中的其它语句注释掉;
    * 5.4 以上面的方法类推,直到paint()方法中没有语句被注释,相信等您看完,您就理解了。
    *
    * 设计目标:在一个JFrame中绘制一个眨眼效果。
    * 设计说明:
    * 在本人想实现眨眼效果的时候,Java提供的绘图工具有点无奈。本设计灵感主要来自于无线电信
    * 号调制,如果你想去了解无线电调制怎么回事,那就找下度娘或者谷哥吧,您也许没必要了解无线电调
    * 制,因为在绘图的时候体现的只不过的绘制直线填充而已,并没有其他的高深内容。
    * 程序的使用了sin()函数的半个周期来完成。本人知道您不喜欢看很多文字描述,很多时候文字
    * 总是无力的,所以请参照《注意事项》中的第5步去调试吧,相信摆在眼前的调试效果会告诉你是怎么
    * 完成的。 ^_^
    *
    * 2014-1-14 星期二
    *
    */

    1. import java.awt.Color;
    2. import java.awt.Graphics;
    3. import javax.swing.JFrame;
    4. public class EyesJFrame extends JFrame{
    5.     //设置角度值,同时也就眼睛的横坐标长度
    6.     int angle = 300;
    7.     //因为眨眼采用的sin()函数组成,所以其自然有幅值这一个属性。
    8.     int amplitude = 30;
    9.     //创建一个用于保存幅值的变化的变量,采用amplitude的缩写ampl,便于认识 ^_^
    10.     int ampl =0;
    11.     //判断是否到了幅值的临界值,由线程维护
    12.     boolean flag = true;
    13.     //定义中心点坐标,个人喜好
    14.     int centerX = 1024/2;
    15.     int centerY = 768/2;
    16.     //创建统一的颜色背景,如果你有兴趣调试的话,也许你就会知道为什么要这么做了。
    17.     Color color = Color.red;
    18.     //灰眼球的半径
    19.     int blackBallSemi = 25;
    20.       
    21.       
    22.     public EyesJFrame() {
    23.         //这里面的内容在本人的《动态中国太极图――Java原创》中有说明,不再做
    24.         //详细介绍,当然您也可以参考一些书籍
    25.         this.setTitle("Eyes");
    26.         this.setSize(centerX*2, centerY*2);
    27.         this.getContentPane().setBackground(Color.black);  
    28.         startRun();
    29.         this.setVisible(true);
    30.     }
    31.     @Override
    32.     public void paint(Graphics graphics) {
    33.         super.paint(graphics);
    34.         //以centerX,centerY为中心,在眼睛所在的地方绘制一个白色的背景底色,
    35.         //长度为angle,宽为amplitude*2
    36.         graphics.setColor(Color.white);
    37.         graphics.fillRect(centerX-angle/2, centerY-amplitude, angle, amplitude*2);
    38.         //以centerX,centerY为中心,绘制一个灰色的眼球
    39.         //半径为blackBallSemi*2
    40.         graphics.setColor(Color.darkGray);
    41.         graphics.fillOval(centerX-blackBallSemi,centerY-blackBallSemi,blackBallSemi*2,blackBallSemi*2);
    42.         //以centerX,centerY为中心,绘制一个白色的瞳孔
    43.         //半径为blackBallSemi/2
    44.         graphics.setColor(Color.white);
    45.         graphics.fillOval(centerX-blackBallSemi/2/2,centerY-blackBallSemi/2/2,blackBallSemi/2,
    46.                   blackBallSemi/2);
    47.         //使用和窗口一样的背景色将眼睛外框颜色去掉,这里使用sin()函数来完成,灵感来收音机自信号调制
    48.         //在这里体现的方法其实就是画直线,把不需要的地方都画成与背景色相同的颜色,这里是中国红
    49.         graphics.setColor(color);
    50.         for (int i = 0; i < angle; i++) {
    51.             graphics.drawLine(centerX-angle/2+i,centerY-30,centerX-angle/2+i,
    52.                 centerY-(int)(Math.sin(Math.PI*i/angle)*ampl));
    53.             graphics.drawLine(centerX-angle/2+i, centerY+30,centerX-angle/2+i,
    54.                 centerY+(int)(Math.sin(Math.PI*i/angle)*ampl));
    55.         }
    56.     }
    57.     /**
    58.      * 用线程维护眼睛的眨眼效果,线程结构如下:
    59.      *  1、该线程使用while(true)维护动态效果
    60.      *  2、ampl用于表示当前的眨眼效果的幅值
    61.      *  3、ampl的值限定在于0到amplitude之间,如果您对这个算法不理解,
    62.      *  请像苍老师那样绘图模型图,但本人觉得您一定能秒杀这种算法  ^_^
    63.      */
    64.     public void startRun() {
    65.         new Thread(){
    66.             public void run() {
    67.                 while(true){
    68.                     if (flag) {
    69.                         ampl++;
    70.                         if (ampl >= amplitude) {
    71.                             flag = false;
    72.                         }
    73.                     }else {
    74.                         ampl--;
    75.                         if (ampl <= 0) {
    76.                             flag = true;
    77.                         }
    78.                     }
    79.                     try {
    80.                         Thread.sleep(40);
    81.                     } catch (InterruptedException e) {
    82.                         e.printStackTrace();
    83.                     }
    84.                     repaint();
    85.                 }
    86.             };
    87.         }.start();
    88.     }
    89.     public static void main(String[] args) {
    90.         new EyesJFrame();
    91.     }
    92. }
    复制代码


       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/11/12/235715171.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 07:38 , Processed in 0.367501 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表