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基础的摄像机,光源,之类不介绍,对于依 ...
随机推荐
- INSPIRED启示录 读书笔记 - 第9章 产品副经理
发现帮手 从本质上讲,产品就是创意,产品经理的职责是想出好点并加以实现.我们需要好点子,有些想法是我们自己的创意,但如果仅依靠自己,就会严重限制创意的发挥 做产品要找公司最聪明的人合作,发现公司里潜在 ...
- Java Map增删改查
示例代码: 学生类 package com.imooc.collection; import java.util.HashSet; import java.util.Set; /** * 学生类 * ...
- 分析新建的android代码
1).xml文件中的<?xml version="1.0" encoding="utf-8"?>是每个xml文件开仅有一个的声明xml的代码. 2) ...
- flume-ng源码阅读RollingFileSink(原创)
org.apache.flume.sink.RollingFileSink 这个类比较简单. source的种类有两种:一种是PollableSource:另外一种是EventDrivenSou ...
- hdu 1695 GCD 莫比乌斯
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- python基础6 - while 循环与转义字符
8. while 循环基本使用 8.1 while 语句基本语法 初始条件设置 —— 通常是重复执行的 计数器 while 条件(判断 计数器 是否达到 目标次数): 条件满足时,做的事情1 条件满足 ...
- Q&A:string、vector、iterator、bitset
细节要点 getline(cin,string)与cin>>string 在VS2013中通过输入换行符\n,对getline以及cin的用法进行测试,但是并没有像文中所述遇到换行符停止读 ...
- os.path.abspath()的作用
语法 os.path.abspath(path) 作用 返回绝对路径 实例 import os print(os.path.abspath(".")) #当前目录的绝对路径 pri ...
- POJ - 2195 最小费用最大流
题意:每个人到每个房子一一对应,费用为曼哈顿距离,求最小的费用 题解:单源点汇点最小费用最大流,每个人和房子对于建边 #include<map> #include<set> # ...
- 51nod 1257 01分数规划/二分
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1257 1257 背包问题 V3 基准时间限制:3 秒 空间限制:1310 ...