黑马程序员技术交流社区
标题:
一段实现组建震动的代码【求高手指点】
[打印本页]
作者:
张亚青
时间:
2013-3-19 20:32
标题:
一段实现组建震动的代码【求高手指点】
本帖最后由 张亚青 于 2013-3-22 13:19 编辑
package main;
/**
* 该类实现传入组件的震动效果
* 该类被PlayFrame调用
*
* 该类创建时
* new ComponentEarthquakeCenter(Container d)
* 参数d接受组件对象
* 然后通过如下函数实现功能
* public void startShake() 功能:使传入组件开始震动
*
*
*
*
*
* */
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ComponentEarthquakeCenter
{
public static final int SHAKE_DISTANCE =15;//震动时离开最初位置最大距离
public static final double SHAKE_CYCLE=40;//震动周期
public static final int SHAKE_DURATION=1000;//震动时长
public static final int SHAKE_UPDATE=15;//震动刷新频率
private Container component;
private Point naturalLocation;//组件的最初位置
private long startTime;
private Timer shakeTimer;
//private final double HALF_PI=Math.PI/2;
private final double TWO_PI=Math.PI*2;
public ComponentEarthquakeCenter(Container d)
{
component=d;
}
/**
* 开始震动
*
* */
public void startShake()
{
naturalLocation=component.getLocation();
startTime=System.currentTimeMillis();
shakeTimer=
new Timer(SHAKE_UPDATE,
new ActionListener()
{
public void actionPerformed(ActionEvent e)//利用三角函数模拟震动效果
{
long elapsed=System.currentTimeMillis()-startTime;
double waveOffset=(elapsed%SHAKE_CYCLE)/SHAKE_CYCLE;
double angle =waveOffset*TWO_PI;
int shakenX=(int)((Math.sin(angle)*SHAKE_DISTANCE)+naturalLocation.x);
component.setLocation(shakenX,naturalLocation.y);
component.repaint();
if(elapsed>=SHAKE_DURATION)
stopShake();
}
});
shakeTimer.start();
}
/**
*
* 停止震动
*/
private void stopShake()
{
shakeTimer.stop();
component.setLocation(naturalLocation);
component.repaint();
}
/***/
public static void main(String[] args )
{
JOptionPane pane=
new JOptionPane("",JOptionPane.ERROR_MESSAGE,JOptionPane.OK_OPTION);
JDialog d=pane.createDialog(null,"shakin'!'");
ComponentEarthquakeCenter dec=new ComponentEarthquakeCenter(d);
d.pack();
d.setModal(false);
d.setVisible(true);
dec.startShake();
while(pane.getValue()==JOptionPane.UNINITIALIZED_VALUE)
{
try{Thread.sleep(100);}
catch(InterruptedException e){}
}
System.exit(0);
}
}
复制代码
求高手给指点一下代码中是否有问题,或者是否有更好的方法实现组建的震动效果。
作者:
blackcaismine
时间:
2013-3-22 10:12
看不出啥问题,不过不好玩,我给他改了一下,鼠标一旦想要按确定就震动!
当然我限制了一下,第三次移进去它就不会跑了,不然好像会出奇怪的问题{:soso_e120:}
package netagain;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ComponentEarthquakeCenter
{
public static final int SHAKE_DISTANCE =250;//震动时离开最初位置最大距离
public static final double SHAKE_CYCLE=10;//震动周期
public static final int SHAKE_DURATION=1000;//震动时长
public static final int SHAKE_UPDATE=10;//震动刷新频率
private Container component;
private Point naturalLocation;//组件的最初位置
private long startTime;
private Timer shakeTimer;
//private final double HALF_PI=Math.PI/2;
private final double TWO_PI=Math.PI*2;
public ComponentEarthquakeCenter(Container d)
{
component=d;
}
/**
* 开始震动
*
* */
public void startShake()
{
naturalLocation=component.getLocation();
startTime=System.currentTimeMillis();
shakeTimer=new Timer(SHAKE_UPDATE,new ActionListener()
{
public void actionPerformed(ActionEvent e)//利用三角函数模拟震动效果
{
long elapsed=System.currentTimeMillis()-startTime;
double waveOffset=(elapsed%SHAKE_CYCLE)/SHAKE_CYCLE;
double angle =waveOffset*TWO_PI;
int shakenX=(int)((Math.sin(angle)*SHAKE_DISTANCE)+naturalLocation.x);
int shakenY=(int)((Math.cos(angle)*SHAKE_DISTANCE)+naturalLocation.y);
component.setLocation(shakenX,shakenY);
component.repaint();
if(elapsed>=SHAKE_DURATION)
stopShake();
}
});
shakeTimer.start();
}
/**
*
* 停止震动
*/
private void stopShake()
{
shakeTimer.stop();
component.setLocation(naturalLocation);
component.repaint();
}
/***/
public static void main(String[] args )
{
JOptionPane pane=
new JOptionPane("",JOptionPane.ERROR_MESSAGE,JOptionPane.OK_OPTION);
JDialog d=pane.createDialog(null,"shakin'!'哈哈哈哈哈哈!!");
final ComponentEarthquakeCenter dec=new ComponentEarthquakeCenter(d);
d.pack();
d.setModal(false);
d.setVisible(true);
pane.addMouseListener(new MouseAdapter()
{
private int count = 1;
public void mouseEntered(MouseEvent e)
{
count++;
if(count>3)
return;
dec.startShake();
}
}
);
while(pane.getValue()==JOptionPane.UNINITIALIZED_VALUE)
{
try{Thread.sleep(100);}
catch(InterruptedException e){}
}
System.exit(0);
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2