GWT实现平滑移动图片效果
在一些网站的首页上,顶部总会存在一些平滑移动的图片,一般用来投放广告或者业务介绍。多个图片只在一个区域展示,仅通过一些方法来不停的移动这个区域的图片来达到展示多个图片的目的。如果是普通的网页,使用Jquery是很好实现的,那么在GWT上该怎么实现呢?当然,GWT也存在“GQuery”,意思是在GWT上使用的Jquery。闲空的时候,我用纯GWT试了一下,发现一样能达到这样的效果。如下图显示效果:

实现这样的效果,其中有两个要点,第一,什么样的Panel支持平滑移动;第二,实现自动移动需要怎么做。翻阅了下资料,发现LayoutPanel支持上下、左右移动,并且其中它其中有一个animate()方法,支持动画效果。自动移动在Jquery中可以用setTimeOut实现,在GWT存在一个Timer类,功能类似于Jquery中的settimeout,它可以实现自动延时调用方法。
在可视化界面下的结构如下图:

几个按钮放在一个HorizontalPanel下,在AbsolutePanel下,我放置了两个控件,一个是ap,即是一个LayoutPanel,里面是一个水平Panel,根据LayoutPanel的特点,在移动的时候,就移动内部的水平Panel就行。水平panel里面我放了四张图片作为测试。
关于底下的dots,它也是一个水平Panel,里面放的是四个FocusPanel,对应那四个可点击的点。并给它们设置的样式。在此处,我使用的图片是140*100px的,所以内部的数值是调试过的。布局代码如下:
VerticalPanel rootPanel = new VerticalPanel();
rootPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
initWidget(rootPanel); HorizontalPanel horizontalPanel = new HorizontalPanel();
rootPanel.add(horizontalPanel);
albumWidth=510; Button next = new Button("Next");
horizontalPanel.add(next);
next.addClickHandler(new ClickHandler() { @Override
public void onClick(ClickEvent event) {
offsetAlbum();
}
}); auto = new Button("Auto");
horizontalPanel.add(auto);
auto.addClickHandler(new ClickHandler() { @Override
public void onClick(ClickEvent event) {
auto.setEnabled(false);
timer = new Timer() { @Override
public void run() {
offsetAlbum();
}
}; timer.scheduleRepeating(2500);
// timer.schedule(100);
}
}); stop = new Button("Stop");
stop.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
auto.setEnabled(true);
timer.cancel();
}
}); horizontalPanel.add(stop); AbsolutePanel absolutePanel = new AbsolutePanel();
rootPanel.add(absolutePanel); ap = new LayoutPanel();
absolutePanel.setSize("520px", "130px");
absolutePanel.add(ap);
ap.setStyleName("scrollStyle");
rootPanel.setCellVerticalAlignment(ap, HasVerticalAlignment.ALIGN_MIDDLE);
rootPanel.setCellHorizontalAlignment(ap, HasHorizontalAlignment.ALIGN_CENTER);
ap.setSize("289px", "108px");
album = new HorizontalPanel();
album.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
album.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
ap.add(album); album.setSpacing(3);
album.setSize("510px", "101px"); Image i1 = new Image("images/01.png");
Image i2 = new Image("images/02.png");
Image i3 = new Image("images/03.png");
Image i4 = new Image("images/04.png");
album.add(i1);
album.add(i2);
album.add(i3);
album.add(i4); dots = new HorizontalPanel();
dots.setSpacing(3);
dots.setVerticalAlignment(HasVerticalAlignment.ALIGN_BOTTOM);
dots.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
absolutePanel.add(dots,235,110); dot1 = new FocusPanel();
dot1.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
offset=0;
offsetAlbum();
changeDotStyle(0);
}
});
dot1.setStyleName("dotSelected");
dots.add(dot1);
dot1.setSize("10px", "10px"); dot2 = new FocusPanel();
dot2.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
offset = LENGTH*1;
offsetAlbum();
changeDotStyle(1);
}
});
dot2.setStyleName("dotUnSelected");
dots.add(dot2);
dot2.setSize("10px", "10px"); dot3 = new FocusPanel();
dot3.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
offset=2*LENGTH;
offsetAlbum();
changeDotStyle(2);
}
});
dot3.setStyleName("dotUnSelected");
dots.add(dot3);
dot3.setSize("10px", "10px"); dot4 = new FocusPanel();
dot4.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
offset=LENGTH*3;
offsetAlbum();
offset-=143;
changeDotStyle(3);
}
});
dot4.setStyleName("dotUnSelected");
dots.add(dot4);
dot4.setSize("10px", "10px");
上面的是布局,我在类定义了两个变量和一个常量,分别是private int offset=-143; private final static int LENGTH=-143; private int albumWidth = 0;
其中有三个方法,offsetAlbum(),用于移动album,代码如下:
public void offsetAlbum(){
if((Math.abs(offset))>=albumWidth){
offset=0;
}
ap.setWidgetLeftRight(album, offset, Unit.PX, 0,Unit.PX);
ap.animate(500);
int num =offset/LENGTH;
changeDotStyle(num);
offset-=143;
}
其中6、7行是设置Layout的移动方式和移动完成是动画时间。offset变量会随着每次移动增加位移量,当位移量超过album的宽度的时候,代码2、3行做出判断,将offset设为0,让其从头开始位移。
每次移动图片,下面的几个点也要跟着“移动”,实际是更改它们是显示样式。用一个方法来改变样式changeDotStyle():
public void changeDotStyle(int num){
if(num==0){
dot1.setStyleName("dotSelected");
dot2.setStyleName("dotUnSelected");
dot3.setStyleName("dotUnSelected");
dot4.setStyleName("dotUnSelected");
}
if(num==1){
dot2.setStyleName("dotSelected");
dot1.setStyleName("dotUnSelected");
dot3.setStyleName("dotUnSelected");
dot4.setStyleName("dotUnSelected");
}
if(num==2){
dot3.setStyleName("dotSelected");
dot1.setStyleName("dotUnSelected");
dot2.setStyleName("dotUnSelected");
dot4.setStyleName("dotUnSelected");
}
if(num==3){
dot4.setStyleName("dotSelected");
dot1.setStyleName("dotUnSelected");
dot2.setStyleName("dotUnSelected");
dot3.setStyleName("dotUnSelected");
}
}
两个样式如下:
.dotSelected{
background-color: #ff0000;
}
.dotUnSelected{
background-color: #00ff00;
}
并且在每个点上面设置了点击事件,来配合调用offsetAblum和changeDotStyle方法,以此达到图片和点同步。
这里我只是做了一个简单的演示,为了说明GWT也可以实现此功能而已。所以此处使用的图片都是固定的,当然,也可以把图片地址放在一个集合中,通过集合传送,再来决定album的宽度设定多少,以及该显示多少个dot,那样会更灵活一些。
GWT实现平滑移动图片效果的更多相关文章
- javascript设计模式实践之职责链--具有百叶窗切换图片效果的JQuery插件(三)
在上一篇<javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)>里,通过采用模板方法模式完成了切换效果对象的构建编写. 接下来就是完成各效果对象的调 ...
- javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)
在上一篇<javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)>里,通过采用迭代器模式完成了各初始化函数的定义和调用. 接下来就要完成各个切换效果的编 ...
- javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)
类似于幻灯片的切换效果,有时需要在网页中完成一些图片的自动切换效果,比如广告,宣传,产品介绍之类的,那么单纯的切就没意思了,需要在切换的时候通过一些效果使得切换生动些. 比较常用之一的就是窗帘切换了. ...
- js矩阵菜单或3D立体预览图片效果
js矩阵菜单或3D立体预览图片效果 下载地址: http://files.cnblogs.com/elves/js%E7%9F%A9%E9%98%B5%E8%8F%9C%E5%8D%95%E6%88% ...
- Android 使用ContentProvider扫描手机中的图片,仿微信显示本地图片效果
版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/1873 ...
- Android Glide加载图片时转换为圆形、圆角、毛玻璃等图片效果
Android Glide加载图片时转换为圆形.圆角.毛玻璃等图片效果 附录1简单介绍了Android开源的图片加载框架.在实际的开发中,虽然Glide解决了快速加载图片的问题,但还有一个问题悬 ...
- QImage与QPixmap加载图片效果(QImage不能拉伸图片,QPixmap默认拉伸图片)
QImage与QPixmap加载图片 效果 . 分类: QT开发 qtQtQT PixmapTest::PixmapTest(QWidget *parent) : QDialog(parent) {t ...
- CSS3旋转图片效果收集
火狐中文网图片效果: [http://i.firefoxchina.cn/?www.firefoxchina.cn] .news-img-wrapper:hover img { transfo ...
- wpf 模拟3D效果(和手机浏览图片效果相似)(附源码)
原文 wpf 模拟3D效果(和手机浏览图片效果相似)(附源码) pf的3D是一个很有意思的东西,类似于ps的效果,类似于电影动画的效果,因为动画的效果,(对于3D基础的摄像机,光源,之类不介绍,对于依 ...
随机推荐
- crm销售管理系统一
一.环境配置 1.首先配置pip,环境变量配置 pip 9.0.1 from c:\users\administrator\envs\crm\lib\site-packages (python 3.6 ...
- Pandas标记删除重复记录
Pandas提供了duplicated.Index.duplicated.drop_duplicates函数来标记及删除重复记录 duplicated函数用于标记Series中的值.DataFrame ...
- Kubernetes pod网络解析
在Kubernetes中,会为每一个pod分配一个IP地址,pod内的所有容器都共享这个pod的network namespace,彼此之间使用localhost通信. 那么pod内所有容器间的网络是 ...
- SQL Server 字符串拼接与拆分 string varchar Split and Join
1.Split SQL Server 2008 新语法: DECLARE @str VARCHAR(MAX) SET @str = REPLACE(@teeIDs, ',', '''),(''' ...
- 语义web相关概念
前言:最近做的项目是自然语言处理相关的,看了一本书<语义web技术基础>,总的来看,接触自然语言处理,语义理解也有差不多一年的时间了.这两天想了一想,自己究竟学到了什么,掌握了哪些新的知识 ...
- 分布式技术 memcached
memcached 是一个高性能的分布式内存对象缓存系统,用于动态web应用,以减轻数据库负载,它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.memcache ...
- QT 使用QTcpServer QTcpSocket 建立TCP服务器端 和 客户端
1. 如图客户端连接server后,server发送"hello tcp" 给客户端 2. 实例代码 ----------------------------------- s ...
- IOS开发--解析复杂json数据
json的自我介绍:JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言.易于人阅 ...
- mysql数据库优化课程---3、数据库设计是什么
mysql数据库优化课程---3.数据库设计是什么 一.总结 一句话总结: 就是设计各个字段及各个字段类型 1.char,varchar,text同存'ABC'的存储空间为多少? char(255): ...
- 《Think in Java》(七)复用类
Java 中复用代码的方式就是复用类,复用类的方式有: 组合 继承 代理(并没有啥高深的含义,只是在使用类A前,新增了类B,让类B的每个方法去调用类A中对应的方法,也就是说类B代理了类A...不过我还 ...