在一些网站的首页上,顶部总会存在一些平滑移动的图片,一般用来投放广告或者业务介绍。多个图片只在一个区域展示,仅通过一些方法来不停的移动这个区域的图片来达到展示多个图片的目的。如果是普通的网页,使用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实现平滑移动图片效果的更多相关文章

  1. javascript设计模式实践之职责链--具有百叶窗切换图片效果的JQuery插件(三)

    在上一篇<javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)>里,通过采用模板方法模式完成了切换效果对象的构建编写. 接下来就是完成各效果对象的调 ...

  2. javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)

    在上一篇<javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)>里,通过采用迭代器模式完成了各初始化函数的定义和调用. 接下来就要完成各个切换效果的编 ...

  3. javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)

    类似于幻灯片的切换效果,有时需要在网页中完成一些图片的自动切换效果,比如广告,宣传,产品介绍之类的,那么单纯的切就没意思了,需要在切换的时候通过一些效果使得切换生动些. 比较常用之一的就是窗帘切换了. ...

  4. js矩阵菜单或3D立体预览图片效果

    js矩阵菜单或3D立体预览图片效果 下载地址: http://files.cnblogs.com/elves/js%E7%9F%A9%E9%98%B5%E8%8F%9C%E5%8D%95%E6%88% ...

  5. Android 使用ContentProvider扫描手机中的图片,仿微信显示本地图片效果

    版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/1873 ...

  6. Android Glide加载图片时转换为圆形、圆角、毛玻璃等图片效果

     Android Glide加载图片时转换为圆形.圆角.毛玻璃等图片效果 附录1简单介绍了Android开源的图片加载框架.在实际的开发中,虽然Glide解决了快速加载图片的问题,但还有一个问题悬 ...

  7. QImage与QPixmap加载图片效果(QImage不能拉伸图片,QPixmap默认拉伸图片)

    QImage与QPixmap加载图片 效果 . 分类: QT开发 qtQtQT PixmapTest::PixmapTest(QWidget *parent) : QDialog(parent) {t ...

  8. CSS3旋转图片效果收集

    火狐中文网图片效果: [http://i.firefoxchina.cn/?www.firefoxchina.cn] .news-img-wrapper:hover img {     transfo ...

  9. wpf 模拟3D效果(和手机浏览图片效果相似)(附源码)

    原文 wpf 模拟3D效果(和手机浏览图片效果相似)(附源码) pf的3D是一个很有意思的东西,类似于ps的效果,类似于电影动画的效果,因为动画的效果,(对于3D基础的摄像机,光源,之类不介绍,对于依 ...

随机推荐

  1. PHP扩展模块Pecl、Pear以及Perl的区别

    一.简短总结:pear:一个书写的比较规范,国外较流行的工具箱代码集pecl:php扩展包,但不属于php基本扩展范围perl:一种早于php出现的脚本级语言,php借鉴了他的正则表达式部分 二.Pe ...

  2. 20145230《JAVA程序设计》第1周学习总结

    20145230<JAVA程序设计>第一周学习总结 教材学习内容总结 在第一周的学习中,我初次认识了JAVA程序的一些基础知识.首先,我们需要在网上先下载JDK或者JDE,通过视频的学习, ...

  3. 优美的英文诗歌Beautiful English Poetry

    <When you are old>——<当你老了> --- William Butler Yeats ——威廉·巴特勒·叶芝When you are old and grey ...

  4. 数据库系统概论学习3-SQL 语句和关系代数(一)SQL 入门

    3. SQL 语句和关系代数(一)SQL 入门 3.1 数据库的编程语言 SQL 的优点 SQL 集成了数据查询(data query).数据操作(data manipulation).数据定义(da ...

  5. 如何在Eclipse环境下安装PyDev并成功运行Python3.6代码

    准备条件: 事先安装好了Eclipse 软件 Python3.6解释器也安装好了 安装PyDev ① 打开Eclipse,到help -> Eclipse markplace 找到PyDev - ...

  6. POI实现数据的导入

    1.POI技术的概述? POI技术:apache POI是可以对微软office文档进行读和写的工具. l HSSF:操作97格式的excel,扩展名:.xls 纯二进制,最大行数65535. l X ...

  7. struts2数据类型转换详解

    Web应用程序的交互都是建立在HTTP之上的,互相传递的都是字符串.也就是说服务器接收到的来自用户的数据只能是字符串或者是字符数组,而在Web应用的对象中,往往使用了多种不同的类型,如整数(int). ...

  8. DH03-单一职责原则

    模式简介 就一个类而言,应该仅有一个引起它变化的原因.不要存在多于一个导致类变更的原因.遵循单一职责原则.分别建立两个类T1和T2,使T1完成P1功能,T2完成P2功能.当修改T1时,不会使职责P2发 ...

  9. LINUX CENTOS关机与重启命令详解

    Linux centos重启命令: 1.reboot 2.shutdown -r now 立刻重启(root用户使用) 3.shutdown -r 10 过10分钟自动重启(root用户使用) 4.s ...

  10. 64位Navicat Premium安装/破解【含资源】

    开门见山: 1/先安装Navicat Primium,双击Navicat Primium——trial_64.exe(64位) 2/安装好打开Navicat Primium,提示使用或注册时,双击Pa ...