歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

動態眨眼效果---Java實現強大的作品

/**
 * 注意事項:
 *        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 星期二
 *
 */
package practice;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
public class EyesJFrame extends JFrame{
    //設置角度值,同時也就眼睛的橫坐標長度
    int angle = 300;
    //因為眨眼采用的sin()函數組成,所以其自然有幅值這一個屬性。
    int amplitude = 30;
    //創建一個用於保存幅值的變化的變量,采用amplitude的縮寫ampl,便於認識 ^_^
    int ampl = 0;
    //判斷是否到了幅值的臨界值,由線程維護
    boolean flag = true;
    //定義中心點坐標,個人喜好
    int centerX = 1024/2;
    int centerY = 768/2;
    //創建統一的顏色背景,如果你有興趣調試的話,也許你就會知道為什麼要這麼做了。
    Color color = Color.red;
    //灰眼球的半徑
    int blackBallSemi = 25;
     
     
    public EyesJFrame() {
        //這裡面的內容在本人的《動態中國太極圖——Java原創》中有說明,不再做
        //詳細介紹,當然您也可以參考一些書籍
        this.setTitle("Eyes");
        this.setSize(centerX*2, centerY*2);
        this.getContentPane().setBackground=\'#\'"        startRun();
        this.setVisible(true);
    }
    @Override
    public void paint(Graphics graphics) {
        super.paint(graphics);
        //以centerX,centerY為中心,在眼睛所在的地方繪制一個白色的背景底色,
        //長度為angle,寬為amplitude*2
        graphics.setColor(Color.white);
        graphics.fillRect(centerX-angle/2, centerY-amplitude, angle, amplitude*2);
        //以centerX,centerY為中心,繪制一個灰色的眼球
        //半徑為blackBallSemi*2
        graphics.setColor(Color.darkGray);
        graphics.fillOval(    centerX-blackBallSemi,
                            centerY-blackBallSemi,
                            blackBallSemi*2,
                            blackBallSemi*2);
        //以centerX,centerY為中心,繪制一個白色的瞳孔
        //半徑為blackBallSemi/2
        graphics.setColor(Color.white);
        graphics.fillOval(    centerX-blackBallSemi/2/2,
                            centerY-blackBallSemi/2/2,
                            blackBallSemi/2,
                            blackBallSemi/2);
        //使用和窗口一樣的背景色將眼睛外框顏色去掉,這裡使用sin()函數來完成,靈感來收音機自信號調制
        //在這裡體現的方法其實就是畫直線,把不需要的地方都畫成與背景色相同的顏色,這裡是中國紅
        graphics.setColor(color);
        for (int i = 0; i < angle; i++) {
            graphics.drawLine(    centerX-angle/2+i,
                                centerY-30,
                                centerX-angle/2+i,
                                centerY-(int)(Math.sin(Math.PI*i/angle)*ampl));
            graphics.drawLine(    centerX-angle/2+i,
                                centerY+30,
                                centerX-angle/2+i,
                                centerY+(int)(Math.sin(Math.PI*i/angle)*ampl));
        }
    }
    /**
    * 用線程維護眼睛的眨眼效果,線程結構如下:
    *        1、該線程使用while(true)維護動態效果
    *        2、ampl用於表示當前的眨眼效果的幅值
    *        3、ampl的值限定在於0到amplitude之間,如果您對這個算法不理解,
    *            請像蒼老師那樣繪圖模型圖,但本人覺得您一定能秒殺這種算法  ^_^
    */
    public void startRun() {
        new Thread(){
            public void run() {
                while(true){
                    if (flag) {
                        ampl++;
                        if (ampl >= amplitude) {
                            flag = false;
                        }
                    }else {
                        ampl--;
                        if (ampl <= 0) {
                            flag = true;
                        }
                    }
                    try {
                        Thread.sleep(40);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    repaint();
                }
            };
        }.start();
    }
    public static void main(String[] args) {
        new EyesJFrame();
    }
}

動態寫輪眼,絕對值得你擁有的Java原創作品  http://www.linuxidc.com/Linux/2014-01/95251.htm

Copyright © Linux教程網 All Rights Reserved