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

  

最新文章

  1. 自己实现一个简易web服务器
  2. (原)3.2 Zookeeper应用 - 数据的发布与订阅
  3. DOM: 如何获取元素下的第一个子元素
  4. 使用python在SAE上搭建一个微信应用,使用有道翻译的api进行在线翻译
  5. wordpress(一)wordpress环境的搭建
  6. Python笔记·第五章—— 列表(List) 的增删改查及其他方法
  7. Android项目刮刮奖详解(二)
  8. Linux基本命令总结(四)
  9. 「BZOJ1251」序列终结者 (splay 区间操作)
  10. ajax请求封装的公共方法
  11. Verilog HDL小练习
  12. Linux-(lsof,ifconfig,route)
  13. tablayout在中间显示
  14. 微信小程序-隐藏和显示自定义的导航
  15. 【转】oozie安装和自带示例的使用
  16. py-faster-rcnn:在windows上配置
  17. Android View与ViewGroup 关系
  18. Java图片转字符
  19. [转]SSIS包的调用方式
  20. Canvas-三角函数曲线图

热门文章

  1. 手把手教你使用eclipse+qemu+gdb来单步调试ARM内核【学习笔记】
  2. C++逗号表达式
  3. Nginx的访问日志配置信息详解
  4. setfacl设置特定目录的权限
  5. 【P2236】彩票(搜索+剪枝)
  6. springcloud-Api网关服务Zuul
  7. UVA 10909 Lucky Number(树状数组+二分+YY)
  8. uvalive 6938 区间dp
  9. ANT+JMETER + Jenkins 集成1
  10. phalcon: 开启模板缓存和缓存路径