好久没来这里更新了,转一个我在我的msn space上面写的blog:
今天在网上看到了一个很有趣的关于
Swing
扩展的小例子,觉得很有意思,我把他的代码稍微作了些改进,需要的朋友可以立刻在项目中使用。
这个例子主要是为了实现一个“震动”的对话框,这种震动功能在苹果机上应用的比较多。原文对源代码进行了很详细的解释,希望英文好的朋友直接去看原文,然后再回来继续看我的文章,原文的连接附在文章的最后。
下面的代码已经被我做了适当的修改,在代码中,
我也添加了适当的注释,
public class DialogEarthquakeCenter extends Object {
//
窗口距离中心左右晃动的最大距离
public static final int SHAKE_DISTANCE = 10;
//
窗口晃动一个循环(中间,右,中间,左,
中间)所需要的时间
(ms),
//
这个值越小,
晃动的就越快。
public static final double SHAKE_CYCLE = 80;
//
整个晃动所需要的时间。
public static final int SHAKE_DURATION = 300;
//
这个是设定
Swing
多长时间(
ms
)更新窗口的位置。
public static final int SHAKE_UPDATE = 5;
private JDialog dialog;
private Point naturalLocation;
private long startTime;
private Timer shakeTimer;
private final double HALF_PI = Math.PI / 2.0;
private final double TWO_PI = Math.PI * 2.0;
public DialogEarthquakeCenter (JDialog d) {
dialog = d;
}
public void startShake() {
//
保存窗口的原始位置
naturalLocation = dialog.getLocation();
//
保存开始的时间
startTime = System.currentTimeMillis();
shakeTimer =
new Timer(SHAKE_UPDATE,
new ActionListener() {
public void actionPerformed (ActionEvent e) {
//
计算倒目前为止花费的时间
long elapsed = System.currentTimeMillis() -
startTime;
//
下了三角公式是为了利用时间计算出某一时刻晃动的幅度,举例见
A.
double waveOffset = (elapsed % SHAKE_CYCLE) /
SHAKE_CYCLE;
double angle = waveOffset * TWO_PI;
double angley = waveOffset * TWO_PI;
int shakenX = (int) ((Math.sin(angle) *
SHAKE_DISTANCE) +
naturalLocation.x);
int shakenY = (int) ((Math.sin(angley) *
SHAKE_DISTANCE) +
naturalLocation.y);
dialog.setLocation (shakenX, shakenY);
dialog.repaint();
// should we stop timer?
if (elapsed >= SHAKE_DURATION)
stopShake();
}
}
);
shakeTimer.start();
}
public void stopShake() {
shakeTimer.stop();
dialog.setLocation (naturalLocation);
dialog.repaint();
}
//
去掉了
原始代码中的
main
}
A.
下面我来解释一下这里用到的三角函数,其实非常简单,其目的就是让窗口流畅的晃动。
double waveOffset = (elapsed % SHAKE_CYCLE) /SHAKE_CYCLE;
由于窗口是在相对于他的原始位置做周期震动,这个公式是为了将震动的时间换算成相对震动一周的相对比例,举例来说就是:(
%
是取余运算)
20ms
时,震动了
1/4
周,
waveOffset =
(
20%80
)
/80 = 0.25,
到右边最远处。
40ms
时,震动了半周,
waveOffset =
(
40%80
)
/80 = 0.5,
回到起点位置。
60ms
时,震动了
3/4
周,
waveOffset =
(
60%80
)
/80 = 0.25,
到左边最远处。
80ms
时,整好震动一周,
waveOffset =
(
80 %80
)
/80 = 0
,
回到起点位置。
然后继续循环
double angle = waveOffset * TWO_PI
将上述介于
0
到
1
的比例换算成角度,也就是
20ms-1/4
周
-PI/2
。
int shakenX = (int) ((Math.sin(angle) *
SHAKE_DISTANCE) +
naturalLocation.x);
然后再将角度利用
sin
函数换算成相对应的震动幅度。到这里可能会有朋友要问,问什么不利用时间比例
waveOffset
直接换算成震动幅度,
就是好象这样:
int shakenX = (int) ((waveOffset*
SHAKE_DISTANCE) +
naturalLocation.x);
这样也是可以的,利用三角函数可以使振动更加圆滑更加真实,因为
y = sin
(
x
)函数波浪形的曲线,结果是靠近中心的地方震动幅度变化的比较快,远离中心的地方震动幅度变化的比较慢。而使用
waveOffset
直接换算成震动幅度使用的是
y=ax
函数,他的函数图是直线,导致震动幅度变化比较生硬。
原始的代码里面只是设置了
x
方向的震动,我又加入了
y
方向的震动,并且调整了一些参数,使得震动比较柔和。
还有就是,原始代码是含有
main
方法的
application
。在实际开发中根本没用,我把她改写成了一个简单的类。在实际开发中只要在
DialogFactory
里面增加一个方法生成这种对话框就可以了,编码人员可以轻松使用,
i.e.
。
DialogFacotry.createShakeMessageDialog(……)
Public final class DialogFactory {
……
//
这里使用
enum
是为了实现
I18N
,如果不需要的话,可以直接使用
String
private void
create
ShakeMessageDialog(Enum title,
Enum message) {
//
作为例子,这里只是生成一个简单的信息框,只带有一个
ok
按钮。
JOptionPane pane = new JOptionPane(message.localized(),
JOptionPane.INFORMATION_MESSAGE, JOptionPane.DEFAULT_OPTION,
null, null, null);
JDialog dialog = pane.createDialog(DialogFactory.defaultFrame(),
title.localized());
DialogShaker shaker = new DialogShaker(dialog);
dialog.pack();
//
这个很关键,一定要设为
false
dialog.setModal(false);
dialog.setVisible(true);
shaker.startShake();
}
......
//
其他方法。
}
原文:
http://www.oreilly.com/catalog/swinghks/chapter/hack38.pdf
分享到:
相关推荐
我们将主要关注以下几个方面:窗体震动原理、相关API函数以及如何在VC++环境中创建和实现震动窗口。 首先,窗体震动的实现通常涉及到Windows API中的消息处理机制,特别是发送特定的消息给窗体来触发其移动或改变...
本压缩包“vc仿QQ窗口震动,制作震动窗口.zip”包含了一系列用于实现类似QQ窗口震动效果的源代码文件,这在Windows应用程序的交互设计中是一个独特的功能,增加了用户体验的趣味性。 首先,让我们了解核心知识点——...
【震动窗口小程序】是一个在学习MFC(Microsoft Foundation Classes)框架时编写的示例程序,它的主要功能是对窗口进行模拟的“扣扣”或“抖动”,以吸引用户的注意力,这种功能常见于即时通讯软件中,如QQ。...
例如,`震动窗口.cpp`可能包含了实现窗体震动逻辑的代码,而`震动窗口.h`则可能定义了相关的类和函数原型。 7. **工程文件**:`.dsp`和`.dsw`是Visual Studio的工程文件,它们记录了项目的信息,如源文件、配置设置...
"震动窗口"是指在程序运行时,可以使窗口按照预设模式进行抖动,通常用于吸引用户的注意力或实现特定的交互效果。在这个"易语言震动窗口源码.7z"压缩包中,我们预期会找到一个实现了这种功能的源代码文件。 震动...
易语言源码易语言震动窗口源码.rar 易语言源码易语言震动窗口源码.rar 易语言源码易语言震动窗口源码.rar 易语言源码易语言震动窗口源码.rar 易语言源码易语言震动窗口源码.rar 易语言源码易语言震动窗口源码....
"震动窗口"是易语言中一个实用的功能,它能让窗口在屏幕上产生震动效果,通常用于吸引用户的注意力或者作为某种提示。 易语言震动窗口的核心原理在于利用API函数来控制窗口的位置,通过不断改变窗口坐标实现视觉上...
在JavaScript的世界里,模拟QQ窗口振动是一个有趣且实用的技术应用,尤其对于开发具有通知功能的网页应用时。QQ窗口振动效果是当用户收到新消息时,QQ客户端会呈现出的一种吸引用户注意力的方式。在Web端,我们可以...
"震动窗口"是指在程序运行过程中,通过编程技术使窗口产生类似震动的效果,这在某些用户界面设计中可能会用到,比如提示或者吸引用户注意力。 "易语言震动窗口源码"是一个初级教程源码,适合初学者学习易语言的窗口...
本篇文章将详细讲解如何利用jQuery、AJAX以及JavaScript实现一个窗口震动特效,让网页元素产生动态视觉效果。 首先,我们要理解jQuery的核心功能。jQuery库通过选择器(如$("#id")或$(".class"))来选取DOM元素,...
本篇文章将深入探讨如何利用jQuery来实现窗口震动特效,这是Web开发中一种吸引用户注意力的独特视觉效果。 首先,让我们理解标题"jquery窗口震动特效.zip"所指的含义。这里的“窗口”通常指的是浏览器窗口或者网页...
一个窗口震动的小工具,想qq里的一样,想要的可以割肉4分下载
Java窗口震动源码是用于在Java图形用户界面(GUI)应用程序中实现窗口动态效果的技术。在Java中,我们可以使用Java AWT(Abstract Window Toolkit)或Swing库来创建和操作窗口。窗口震动功能通常是为了吸引用户的...
窗口震动源代码,类似于QQ的窗口震动。#include #include int main(int argc, char *argv[]) { RECT rect; //RECT是一个矩形结构体,相当于保存了一个矩形的四条边的坐标 HWND hwnd = NULL,oldhwnd = NULL; //两...
### QQ窗口抖动JS效果详解 #### 一、概述 在网页开发中,为了增加交互性和趣味性,开发者经常会利用JavaScript实现各种动态效果。其中,“QQ窗口抖动JS效果”是一种模仿即时通讯软件(如早期的QQ)窗口抖动功能的...
本文将详细解析标题和描述中提到的"QT窗口渐现效果"、"窗口震动效果"以及"鼠标移动窗口"的实现方法,这些都是Qt框架中用于提升应用界面动态感和用户体验的常见技巧。 1. **QT窗口渐现效果**: 窗口渐现效果主要通过...
QQ窗口震动功能是许多即时通讯软件中的一种交互设计,它能吸引用户注意,尤其是在消息未读或者需要紧急回应的情况下。这个例子将探讨如何在自己的应用程序中实现类似QQ窗口的震动效果。下面,我们将深入讨论相关的...
在IT领域,编程是一项至关重要的技能,而模拟QQ聊天窗口震动效果是许多初学者和爱好者喜欢尝试的项目。本程序段就是为此目的编写的,它使用C或C++语言实现,帮助开发者理解如何通过代码来复现类似QQ聊天窗口的交互...
"易语言窗口震动源码.7z" 是一个压缩包,其中包含了使用易语言编写的实现窗口震动功能的源代码。窗口震动功能在某些应用程序中用于吸引用户的注意力,例如当有新消息或通知时,程序窗口会轻微抖动以提示用户。 在...