在一些网站的首页上,顶部总会存在一些平滑移动的图片,一般用来投放广告或者业务介绍。多个图片只在一个区域展示,仅通过一些方法来不停的移动这个区域的图片来达到展示多个图片的目的。如果是普通的网页,使用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. Grafana连接Prometheus监控Docker平台

    Grafana是一款开源的分析平台. Grafana allows you to query, visualize, alert on and understand your metrics no m ...

  2. c++ boost库学习三:实用工具

    noncopyable 大家都知道定义一个空类的时候,它实际包含了构造函数,拷贝构造函数,赋值操作符和析构函数等. 这样就很容易产生一个问题,就是当用户调用A a(“^_^") 或者A c= ...

  3. poj 2406 Power Strings【字符串+最小循环节的个数】

                                                                                                      Po ...

  4. 百度竞价推广URL通配符使用说明

    {keywordid} 被替换为触发该创意的关键词ID(全局唯一ID,不是字面ID),当没有对应的keywordid时,替换为0. {creative} 被替换为所点击的创意ID(全局唯一ID). 2 ...

  5. Luogu-2495 [SDOI2011]消耗战

    虚树第一题 对于每次询问的点建立一棵虚树,然后在树上DP,一个点的答案就是这个点的父边切断的代价与所有儿子切断的代价去最小值,当然如果这个节点是资源点则必须切父边 注意在虚树上一条边的代价应该是中间所 ...

  6. 如何用Spring框架的<form:form>标签实现REST风格的增删改查操作

    1.首先创建两个bean类,Employee(职工)和Department(部门),一个部门可以有多个职工 Employee类(属性:职工ID:id:姓名:lastName:邮箱:email:性别:g ...

  7. [转载]解析 Java 类和对象的初始化过程

    原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-clobj-init/index.html 由一个单态模式引出的问题谈起 类的初始化和对象初始化 ...

  8. HDU 5992 kd-tree

    还记得青岛的时候和蕾姐讨论了近三个小时也不知道这是什么东西 后来发现是kdtree 于是拖到寒假才补这个算法 写完几道模板题发现多维的kdtree查找最近也是很简单的拓展 于是很快1A了这道题 它真的 ...

  9. codeforces766E Mahmoud and a xor trip(按位统计+树形DP)

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  10. Windows 运行中的命令

    辅助功能选项 access.cpl 添加硬件向导 hdwwiz.cpl 添加或删除程序 appwiz.cpl 管理工具 control admintools 自动更新 wuaucpl.cpl Blue ...