原文:
http://www.java2000.net/p10992
運行效果
運行效果

- import ?java.applet.Applet;
- import ?java.awt.Color;
- import ?java.awt.Dimension;
- import ?java.awt.Font;
- import ?java.awt.Graphics;
- import ?java.awt.Image;
- import ?net.java2000.tools.NoNull;
- /**
- ?*?一段眼睛跟著鼠標轉動的跟蹤眼代碼。<br>
- ?*?你可以單獨運行,或者放在html里面<br>
- ?*?<applet?code="Eye"?codebase="codebase"?width="400"?height="135"
- ?*?name="eyesApplet"><br>
- ?*?<param?name="faceFile"?value="doofus.jpg"/><br>
- ?*?<param?name="testMode"?value="false"/>?<br>
- ?*?<param?name="leftEyeX"?value="75"/>?<br>
- ?*?<param?name="leftEyeY"?value="77"/>?<br>
- ?*?<param?name="rightEyeX"?value="310"/>?<br>
- ?*?<param?name="rightEyeY"?value="75"/><br>
- ?*?<param?name="irisRadius"?value="20"/>?<br>
- ?*?<param?name="pupilRadius"?value="8"/><br>
- ?*?<param?name="leftEyeRadius"?value="5"/><br>
- ?*?<param?name="rightEyeRadius"?value="5"/>?<br>
- ?*?<param?name="horizontalSkew"?value="3.5"/><br>
- ?*?<param?name="eyeIndependence"?value="0.4"/>?<br>
- ?*?<param?name="irisRed"?value="128"/><br>
- ?*?<param?name="irisGreen"?value="64"/>?<br>
- ?*?<param?name="irisBlue"?value="0"/>?<br>
- ?*?<param?name="verticalOffset"?value="100"/>?<br>
- ?*?</applet>
- ?*?
- ?*?@author?趙學慶,Java世紀網(java2000.net)
- ?*?
- ?*/
- public ? class ?Eye? extends ?Applet?{
- ?? private ? static ? final ? long ?serialVersionUID?=?4124530672062457469L;
- ?? private ?String?mErrorMessage;
- ?? private ?Image?mFace;
- ?? private ?Color?mIrisColor,?mPupilColor?=?Color.black;
- ?? private ? int ?mMouseX,?mMouseY;
- ?? private ? int ?mLeftEyeX,?mLeftEyeY,?mRightEyeX,?mRightEyeY;
- ?? private ? int ?mLeftIrisX,?mLeftIrisY,?mRightIrisX,?mRightIrisY;
- ?? private ? int ?mLeftPupilX,?mLeftPupilY,?mRightPupilX,?mRightPupilY;
- ?? private ? int ?mIrisRadius,?mPupilRadius;
- ?? private ? int ?mLeftEyeRadius,?mRightEyeRadius,?mLeftPupilTR,?mRightPupilTR;
- ?? private ? int ?mVerticalOffset;
- ?? //?默認值
- ?? private ? int ?mFaceX?=? 0 ,?mFaceY?=? 0 ;? //?image?start?at?0,?0
- ?? private ? int ?mIrisRed?=? 128 ,?mIrisGreen?=? 64 ,?mIrisBlue?=? 0 ;
- ?? private ? double ?mHorizontalSkew?=? 3.5 ,?mEyeIndependence?=? 0.5 ,?mGapFactor?=? 1.5 ;
- ?? private ? boolean ?mTestMode?=? false ;
- ?? private ?Dimension?mDimension;
- ?? private ?Image?mImage;
- ?? private ?Graphics?mGraphics;
- ?? public ? void ?init()?{
- ????mErrorMessage?=? null ;
- ???? try ?{
- ?????? //?設置的一些參數
- ?????? //?背景的面部圖片
- ??????mFace?=?getImage(getCodeBase(),?NoNull.toString(getParameter( "faceFile" ),? "doofus.jpg" ));
- ?????? //?左側眼睛的x坐標
- ??????mLeftEyeX?=?mLeftIrisX?=?mLeftPupilX?=?Integer.parseInt(NoNull.toString(
- ??????????getParameter( "leftEyeX" ),? "75" ));
- ?????? //?左側眼睛的y坐標
- ??????mLeftEyeY?=?mLeftIrisY?=?mLeftPupilY?=?Integer.parseInt(NoNull.toString(
- ??????????getParameter( "leftEyeY" ),? "77" ));
- ?????? //?右側眼睛的x坐標
- ??????mRightEyeX?=?mRightIrisX?=?mRightPupilX?=?Integer.parseInt(NoNull.toString(
- ??????????getParameter( "rightEyeX" ),? "310" ));
- ?????? //?右側眼睛的y坐標
- ??????mRightEyeY?=?mRightIrisY?=?mRightPupilY?=?Integer.parseInt(NoNull.toString(
- ??????????getParameter( "rightEyeY" ),? "75" ));
- ?????? //?眼睛的白眼球半徑
- ??????mIrisRadius?=?Integer.parseInt(NoNull.toString(getParameter( "irisRadius" ),? "20" ));
- ?????? //?眼睛的瞳孔半徑
- ??????mPupilRadius?=?Integer.parseInt(NoNull.toString(getParameter( "pupilRadius" ),? "8" ));
- ?????? //?左眼睛的移動半徑
- ??????mLeftEyeRadius?=?Integer.parseInt(NoNull.toString(getParameter( "leftEyeRadius" ),? "15" ));
- ?????? //?右眼睛的移動半徑
- ??????mRightEyeRadius?=?Integer.parseInt(NoNull.toString(getParameter( "rightEyeRadius" ),? "5" ));
- ?????? //?可選參數
- ?????? if ?(getParameter( "testMode" )?!=? null )
- ????????mTestMode?=?Boolean.valueOf(NoNull.toString(getParameter( "testMode" ),? "true" ))
- ????????????.booleanValue();
- ?????? if ?(getParameter( "horizontalSkew" )?!=? null )
- ????????mHorizontalSkew?=?Double.valueOf(
- ????????????NoNull.toString(getParameter( "horizontalSkew" ),? "13.5" )).doubleValue();
- ?????? if ?(getParameter( "eyeIndependence" )?!=? null )
- ????????mEyeIndependence?=?Double.valueOf(
- ????????????NoNull.toString(getParameter( "eyeIndependence" ),? "0.4" )).doubleValue();
- ?????? if ?(getParameter( "irisRed" )?!=? null )
- ????????mIrisRed?=?Integer.parseInt(NoNull.toString(getParameter( "irisRed" ),? "128" ));
- ?????? if ?(getParameter( "irisGreen" )?!=? null )
- ????????mIrisGreen?=?Integer.parseInt(NoNull.toString(getParameter( "irisGreen" ),? "64" ));
- ?????? if ?(getParameter( "irisBlue" )?!=? null )
- ????????mIrisBlue?=?Integer.parseInt(NoNull.toString(getParameter( "irisBlue" ),? "0" ));
- ??????mIrisColor?=? new ?Color(mIrisRed,?mIrisGreen,?mIrisBlue);
- ?????? if ?(getParameter( "verticalOffset" )?!=? null )
- ????????mVerticalOffset?=?Integer.parseInt(NoNull.toString(getParameter( "verticalOffset" ),
- ???????????? "100" ));
- ????}? catch ?(Exception?e)?{
- ??????mErrorMessage?=? "Bad?or?missing?required?parameter." ;
- ??????e.printStackTrace();
- ????}
- ???? //?計算眼球的移動半徑
- ????mLeftPupilTR?=?mLeftEyeRadius?+?mIrisRadius?-?( int )?(mGapFactor?*?mPupilRadius);
- ????mRightPupilTR?=?mRightEyeRadius?+?mIrisRadius?-?( int )?(mGapFactor?*?mPupilRadius);
- ???? //?偵聽鼠標事件
- ????MouseMotion?aMouseMotion?=? new ?MouseMotion();
- ???? this .addMouseMotionListener(aMouseMotion);
- ???? this .setSize( 400 ,? 135 );
- ??}
- ?? public ? void ?paintFrame(Graphics?g)?{
- ???? if ?(mErrorMessage?!=? null )?{
- ??????showError(g);
- ?????? return ;
- ????}
- ???? //?背景面部
- ????g.drawImage(mFace,?mFaceX,?mFaceY,? this );
- ???? //?畫外部的球體
- ????g.setColor(mIrisColor);
- ????g.fillOval(mLeftIrisX?-?mIrisRadius,?mLeftIrisY?-?mIrisRadius,? 2 ?*?mIrisRadius,
- ???????? 2 ?*?mIrisRadius);
- ????g.fillOval(mRightIrisX?-?mIrisRadius,?mRightIrisY?-?mIrisRadius,? 2 ?*?mIrisRadius,
- ???????? 2 ?*?mIrisRadius);
- ???? //?畫瞳孔
- ????g.setColor(mPupilColor);
- ????g.fillOval(mLeftPupilX?-?mPupilRadius,?mLeftPupilY?-?mPupilRadius,? 2 ?*?mPupilRadius,
- ???????? 2 ?*?mPupilRadius);
- ????g.fillOval(mRightPupilX?-?mPupilRadius,?mRightPupilY?-?mPupilRadius,? 2 ?*?mPupilRadius,
- ???????? 2 ?*?mPupilRadius);
- ???? if ?(mTestMode)?{
- ??????g.drawOval(mLeftEyeX?-?mLeftEyeRadius,?mLeftEyeY?-?mLeftEyeRadius,? 2 ?*?mLeftEyeRadius,
- ?????????? 2 ?*?mLeftEyeRadius);
- ??????g.drawOval(mRightEyeX?-?mRightEyeRadius,?mRightEyeY?-?mRightEyeRadius,
- ?????????? 2 ?*?mRightEyeRadius,? 2 ?*?mRightEyeRadius);
- ????}
- ??}
- ?? public ? void ?mouseMoved()?{
- ???? //?coordinates?for?the?left?iris
- ???? int ?leftDX?=?mMouseX?-?mLeftEyeX;
- ???? int ?leftDY?=?mMouseY?-?mLeftEyeY;
- ???? if ?(leftDY?==? 0 )
- ??????leftDY?=? 1 ;? //?prevent?divide?by?zero
- ???? double ?leftDXDY?=?( double )?leftDX?/?leftDY;
- ???? double ?leftdy?=?Math.sqrt(Math.pow(mLeftEyeRadius,? 2 )?/?(Math.pow(leftDXDY,? 2 )?+? 1 ));
- ???? if ?(leftDY?<? 0 )?{
- ??????leftdy?=?-leftdy;
- ????}
- ???? double ?leftdx?=?leftDXDY?*?leftdy?*?mHorizontalSkew;
- ???? //?coordinates?for?the?right?iris
- ???? int ?rightDX?=?mMouseX?-?mRightEyeX;
- ???? int ?rightDY?=?mMouseY?-?mRightEyeY;
- ???? if ?(rightDY?==? 0 )
- ??????rightDY?=? 1 ;? //?prevent?divide?by?zero
- ???? double ?rightDXDY?=?( double )?rightDX?/?rightDY;
- ???? double ?rightdy?=?Math.sqrt(Math.pow(mRightEyeRadius,? 2 )?/?(Math.pow(rightDXDY,? 2 )?+? 1 ));
- ???? if ?(rightDY?<? 0 )?{
- ??????rightdy?=?-rightdy;
- ????}
- ???? double ?rightdx?=?rightDXDY?*?rightdy?*?mHorizontalSkew;
- ???? //?adjustments?for?the?irises
- ???? double ?avedx?=?(rightdx?+?leftdx)?/? 2 ;
- ???? double ?avedy?=?(rightdy?+?leftdy)?/? 2 ;
- ????leftdx?=?leftdx?+?(avedx?-?leftdx)?*?( 1 ?-?mEyeIndependence);
- ????rightdx?=?rightdx?+?(avedx?-?rightdx)?*?( 1 ?-?mEyeIndependence);
- ????leftdy?=?leftdy?+?(avedy?-?leftdy)?*?( 1 ?-?mEyeIndependence);
- ????rightdy?=?rightdy?+?(avedy?-?rightdy)?*?( 1 ?-?mEyeIndependence);
- ???? //?new?iris?positions
- ????mLeftIrisX?=?mLeftEyeX?+?( int )?leftdx;
- ????mLeftIrisY?=?mLeftEyeY?+?( int )?leftdy;
- ????mRightIrisX?=?mRightEyeX?+?( int )?rightdx;
- ????mRightIrisY?=?mRightEyeY?+?( int )?rightdy;
- ???? //?coordinates?for?the?left?pupil
- ???? double ?leftpdy?=?Math.sqrt(Math.pow(mLeftPupilTR,? 2 )?/?(Math.pow(leftDXDY,? 2 )?+? 1 ));
- ???? if ?(leftDY?<? 0 )?{
- ??????leftpdy?=?-leftpdy;
- ????}
- ???? double ?leftpdx?=?leftDXDY?*?leftpdy?*?(mHorizontalSkew?-?mGapFactor);
- ???? //?coordinates?for?the?right?pupil
- ???? double ?rightpdy?=?Math.sqrt(Math.pow(mRightPupilTR,? 2 )?/?(Math.pow(rightDXDY,? 2 )?+? 1 ));
- ???? if ?(rightDY?<? 0 )?{
- ??????rightpdy?=?-rightpdy;
- ????}
- ???? double ?rightpdx?=?rightDXDY?*?rightpdy?*?(mHorizontalSkew?-?mGapFactor);
- ???? //?adjustments?for?the?pupils
- ???? double ?avepdx?=?(rightpdx?+?leftpdx)?/? 2 ;
- ???? double ?avepdy?=?(rightpdy?+?leftpdy)?/? 2 ;
- ????leftpdx?=?leftpdx?+?(avepdx?-?leftpdx)?*?( 1 ?-?mEyeIndependence);
- ????rightpdx?=?rightpdx?+?(avepdx?-?rightpdx)?*?( 1 ?-?mEyeIndependence);
- ????leftpdy?=?leftpdy?+?(avepdy?-?leftpdy)?*?( 1 ?-?mEyeIndependence);
- ????rightpdy?=?rightpdy?+?(avepdy?-?rightpdy)?*?( 1 ?-?mEyeIndependence);
- ???? //?new?pupil?positions
- ????mLeftPupilX?=?mLeftEyeX?+?( int )?leftpdx;
- ????mLeftPupilY?=?mLeftEyeY?+?( int )?leftpdy;
- ????mRightPupilX?=?mRightEyeX?+?( int )?rightpdx;
- ????mRightPupilY?=?mRightEyeY?+?( int )?rightpdy;
- ????repaint();
- ??}
- ?? public ? void ?update(Graphics?g)?{
- ????paint(g);
- ??}
- ?? public ? void ?paint(Graphics?g)?{
- ????Dimension?d?=?getSize();
- ???? //?create?the?offscreen?graphics?context
- ???? if ?((mGraphics?==? null )?||?(d.width?!=?mDimension.width)
- ????????||?(d.height?!=?mDimension.height))?{
- ??????mDimension?=?d;
- ??????mImage?=?createImage(d.width,?d.height);
- ??????mGraphics?=?mImage.getGraphics();
- ????}
- ???? //?erase?the?previous?image
- ????mGraphics.setColor(getBackground());
- ????mGraphics.fillRect( 0 ,? 0 ,?d.width,?d.height);
- ????mGraphics.setColor(Color.black);
- ???? //?paint?the?frame?into?the?image
- ????paintFrame(mGraphics);
- ???? //?paint?the?image?onto?the?screen
- ????g.drawImage(mImage,? 0 ,? 0 ,? null );
- ??}
- ?? class ?MouseMotion? extends ?java.awt.event.MouseMotionAdapter?{
- ???? public ? void ?mouseMoved(java.awt.event.MouseEvent?event)?{
- ??????Object?object?=?event.getSource();
- ?????? if ?(object?==?Eye. this )
- ????????mouseMovedInApplet(event);
- ????}
- ??}
- ?? void ?mouseMovedInApplet(java.awt.event.MouseEvent?event)?{
- ???? //?get?the?mouse?coords
- ????mMouseX?=?event.getX();
- ????mMouseY?=?event.getY();
- ????mouseMoved();
- ??}
- ?? public ? void ?mouseMovedInBrowser( int ?x,? int ?y,? int ?windowWidth)?{
- ???? int ?appletW?=?getSize().width;
- ???? //?adjust?mouse?x?and?y?relative?to?applet?position
- ????mMouseX?=?x?-?(windowWidth?-?appletW)?/? 2 ;
- ????mMouseY?=?y?-?mVerticalOffset;
- ????mouseMoved();
- ??}
- ?? private ? void ?showError(Graphics?g)?{
- ????g.setFont( new ?Font( "TimesRoman" ,?Font.BOLD,? 12 ));
- ????g.drawString(mErrorMessage,? 10 ,? 20 );
- ??}
- }
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
