• Java 动态眨眼 EyesJPanel (整理)


      1 /**
      2  *                     Java 动态眨眼 EyesJPanel (整理)
      3  *                      
      4  *                                             2016-1-2 深圳 南山平山村 曾剑锋
      5  * 注意事项:
      6  *         1、本程序为java程序,同时感谢您花费宝贵的时间来阅读本文档;
      7  *         2、请注意包名为:practice,文件名为:EyesJFrame,注意检查,以防一些不必要的麻烦;
      8  *         3、在完成确认2中的内容后,本程序可以直接运行,因为本软件说明都在注释中;
      9  *         4、由于本例子是继《动态中国太极图——Java原创》后编写,所以在那里面已说明的东西,不再详述,
     10  *                 同时由于个人能力、阅历等原因,有些细节可能并没有详细阐述,或者有疏漏,请谅解。        
     11  *         5、您可以注释paint()方法中的一些代码,因为效果很直观,也许这样您理解得更快,建议如下:
     12  *             5.1 先看paint()方法第1条语句效果,把paint()方法中的其它语句注释掉;
     13  *             5.2 再看paint()方法第1、2条语句效果,把paint()方法中的其它语句注释掉;
     14  *             5.3 再看paint()方法第1、2、3条语句效果,把paint()方法中的其它语句注释掉;
     15  *             5.4 以上面的方法类推,直到paint()方法中没有语句被注释,相信等您看完,您就理解了。
     16  *
     17  * 设计目标:在一个JFrame中绘制一个眨眼效果。
     18  * 设计说明:   
     19  *             在本人想实现眨眼效果的时候,Java提供的绘图工具有点无奈。本设计灵感主要来自于无线电信
     20  *         号调制,如果你想去了解无线电调制怎么回事,那就找下度娘或者谷哥吧,您也许没必要了解无线电调
     21  *         制,因为在绘图的时候体现的只不过的绘制直线填充而已,并没有其他的高深内容。
     22  *             程序的使用了sin()函数的半个周期来完成。本人知道您不喜欢看很多文字描述,很多时候文字
     23  *         总是无力的,所以请参照《注意事项》中的第5步去调试吧,相信摆在眼前的调试效果会告诉你是怎么
     24  *         完成的。   ^_^
     25  *
     26  *    2014-1-13 星期一 晴 8度 微风 南昌
     27  *
     28  */
     29 package demo;
     30 
     31 import java.awt.Color;
     32 import java.awt.Graphics;
     33 import javax.swing.JFrame;
     34 import javax.swing.JPanel;
     35 
     36 public class EyesJPanel extends JPanel{
     37     //设置角度值,同时也就眼睛的横坐标长度
     38     public static int angle = 300;
     39     //因为眨眼采用的sin()函数组成,所以其自然有幅值这一个属性。
     40     int amplitude = 40;
     41     //创建一个用于保存幅值的变化的变量,采用amplitude的缩写ampl,便于认识 ^_^
     42     int ampl = 0;
     43     //判断是否到了幅值的临界值,由线程维护
     44     boolean flag = true;
     45     //定义中心点坐标,个人喜好
     46     static int centerX = 600/2;
     47     static int centerY = 300/2;
     48     //创建统一的颜色背景,如果你有兴趣调试的话,也许你就会知道为什么要这么做了。
     49     Color color = Color.red;
     50     //灰眼球的半径
     51     int blackBallSemi = 25;
     52    
     53    
     54     public EyesJPanel() {
     55         //这里面的内容在本人的《动态中国太极图——Java原创》中有说明,不再做
     56         //详细介绍,当然您也可以参考一些书籍
     57         
     58         startRun();
     59     }
     60     @Override
     61     public void paint(Graphics graphics) {
     62         super.paint(graphics);
     63         this.setBackground(Color.red);
     64         //以centerX,centerY为中心,在眼睛所在的地方绘制一个白色的背景底色,
     65         //长度为angle,宽为amplitude*2
     66         graphics.setColor(Color.white);
     67         graphics.fillRect(centerX-angle/2, centerY-amplitude, angle, amplitude*2);
     68         //以centerX,centerY为中心,绘制一个灰色的眼球
     69         //半径为blackBallSemi*2
     70         graphics.setColor(Color.darkGray);
     71         graphics.fillOval(    centerX-blackBallSemi,
     72                             centerY-blackBallSemi,
     73                             blackBallSemi*2,
     74                             blackBallSemi*2);
     75         //以centerX,centerY为中心,绘制一个白色的瞳孔
     76         //半径为blackBallSemi/2
     77         graphics.setColor(Color.white);
     78         graphics.fillOval(    centerX-blackBallSemi/2/2,
     79                             centerY-blackBallSemi/2/2,
     80                             blackBallSemi/2,
     81                             blackBallSemi/2);
     82         //使用和窗口一样的背景色将眼睛外框颜色去掉,这里使用sin()函数来完成,灵感来收音机自信号调制
     83         //在这里体现的方法其实就是画直线,把不需要的地方都画成与背景色相同的颜色,这里是中国红
     84         graphics.setColor(color);
     85         for (int i = 0; i < angle; i++) {
     86             graphics.drawLine(    centerX-angle/2+i,
     87                                 centerY-amplitude,
     88                                 centerX-angle/2+i,
     89                                 centerY-(int)(Math.sin(Math.PI*i/angle)*ampl));
     90             graphics.drawLine(    centerX-angle/2+i,
     91                                 centerY+amplitude,
     92                                 centerX-angle/2+i,
     93                                 centerY+(int)(Math.sin(Math.PI*i/angle)*ampl));
     94         }
     95     }
     96     /**
     97      * 用线程维护眼睛的眨眼效果,线程结构如下:
     98      *         1、该线程使用while(true)维护动态效果
     99      *         2、ampl用于表示当前的眨眼效果的幅值
    100      *         3、ampl的值限定在于0到amplitude之间,如果您对这个算法不理解,
    101      *             请像苍老师那样绘图模型图,但本人觉得您一定能秒杀这种算法  ^_^
    102      */
    103     public void startRun() {
    104         new Thread(){
    105             public void run() {
    106                 while(true){
    107                     if (flag) {
    108                         ampl++;
    109                         if (ampl >= amplitude) {
    110                             flag = false;
    111                         }
    112                     }else {
    113                         ampl--;
    114                         if (ampl <= 0) {
    115                             flag = true;
    116                         }
    117                     }
    118                     try {
    119                         Thread.sleep(40);
    120                     } catch (InterruptedException e) {
    121                         e.printStackTrace();
    122                     }
    123                     repaint();
    124                 }
    125             };
    126         }.start();
    127     }
    128     public static void main(String[] args) {
    129         JFrame jFrame = new JFrame();
    130         jFrame.setTitle("Eyes");
    131         jFrame.setSize(centerX*2, centerY*2);
    132         jFrame.setLocationRelativeTo(null);
    133         JPanel jPanel = new EyesJPanel();
    134         jFrame.add(jPanel);
    135         
    136         jFrame.setVisible(true);
    137     }
    138 }

     

  • 相关阅读:
    【数据分析】6 点发的文章在博客园阅读量最高?
    canvas api 速记
    leetcode 315. Count of Smaller Numbers After Self 两种思路
    一道闭包题题解
    一道经典JS题(关于this)
    HTML5 — 让拖放变的流行起来
    你应该知道的25道Javascript面试题
    关于base64编码的原理和实现
    Python中的None
    Python字符编码和转码
  • 原文地址:https://www.cnblogs.com/zengjfgit/p/5094812.html
Copyright © 2020-2023  润新知