GWT实现“跟随标题栏”
在一些商城或者博客上,随处可见一些“跟随的标题栏”,什么是”跟随的标题栏“呢?它的效果是当浏览器窗口移到看不见某处内容的时候,这块内容的标题会紧贴在浏览器顶部,跟随浏览器滑动,当用户将浏览器内容往上拖动的时候,这个标题又会自动还原。例如淘宝的顶部搜索栏如下。

这种方法在GWT也可以实现,最近做了一个测试,发现效果一样,特说下思路,贴出代码,以作后用。
思路:
GWT的界面上提供了一个方法,名为:Window.addWindowScrollHandler(Handler handler),该方法可以监视窗口的拖动。在这个方法里,我们可以进行我们想要的操作。
关于怎么“浮出”这个标题,我首先想到是的使用PopPanel实现,它可以实现精确的定位,但要在其中显示和要浮动的标题一样的控件,必须得先有这个控件才行,但GWT中不允许一个布局控件多次引用。所以在此我用的是一种“障眼法”,创建两个一样的标题控件,将其中一个放在PopPanel中即可。
总体实现方法是这样的:在窗体滑动事件中,根据我们设置的条件,滑到某个程度的时候,弹出一个PopPanel,其中的内容和要“浮动”标题一样,但回到某个地方,将该PopPanel隐藏即可。
代码如下:
Window.addWindowScrollHandler(new Window.ScrollHandler() {
public void onWindowScroll(Window.ScrollEvent event) {
int topDistance = View1.getAbsoluteTop();
int left = View1.getAbsoluteLeft();
floatPanel.setWidget(View2);
int w = Window.getScrollTop();
floatPanel.setPopupPosition(left, w);
if(event.getScrollTop()>topDistance){
floatPanel.show();
}else{
floatPanel.hide();
}
}
});
上述代码中的View1和View2其实是两个相同的控件。第三行中有一个getAbsoulutTop()方法,是获取该控件在浏览器中离浏览器顶部的距离。所以在第8行中我们就可以判断,在窗体滑动高度大于该控件里窗体的高度的时候,就将该floatPanel显示出来,否则隐藏。关于PopPanel,它必须拥有坐标,即在浏览器中的位置坐标。高度我们可以使用Window.getScrollTop(),即滑动条的高度,所以一直是在浏览器顶部的。关于离浏览器左边的距离,我们可以在窗体中获取一个相对位置,要想实现PopPanel在隐藏和显示和原控件重叠,最好的办法就是将原控件作为相对位置,所以浮动Panel距离浏览器左边的距离就是原控件距离浏览器左边的距离。
补充一点:在浏览器是可以改变大小的,这个原控件的位置可能会改变,floatPanel也应该要改变其X坐标才合理,因为一旦浏览器再放大或缩小窗口,floatPanel还会是原来的位置,造成位置偏移。幸好,GWT还提供了一个方法:
Window.addResizeHandler(new ResizeHandler() {
@Override
public void onResize(ResizeEvent event) {
//method here
}
});
该方法将监视浏览器缩放情况,一旦浏览器缩放了,就会触发事件。所以把两者结合起来,可以实现:但浏览器缩放的时候,重新获取原控件的X左标,并跟着立即改变PopPanel的X坐标,这样就不会出现缩放浏览器“浮动标题”移位了。
GWT实现“跟随标题栏”的更多相关文章
- PyQt:无边框自定义标题栏及最大化最小化窗体大小调整
环境 Python3.5.2 PyQt5 陈述 隐藏掉系统的控制栏,实现了自定义的标题控制栏,以及关闭/最大化/最小化的功能,自由调整窗体大小的功能(跟随一个大佬学的),代码内有详细注释 只要把Mai ...
- Android ViewPager+HorizontalScrollView实现标题栏滑动(腾讯新闻)
1) ViewPager提供了左右滑动切换页面的方法,但是它所提供的标题只是无语,估计没有真正的项目会照搬拿过来;并且它只能一页一页滑,我想直接查看最后一页要滑半天; 2) 看了腾讯新闻客户端感觉体验 ...
- c# 窗体相关操作(最大化/最小化/关闭/标题栏)
/// <summary> /// 窗体跟随鼠标移动的标记 /// </summary> private bool normalmoving = false; /// < ...
- Unity3d学习 相机的跟随
最近在写关于相机跟随的逻辑,其实最早接触相机跟随是在Unity官网的一个叫Roll-a-ball tutorial上,其中简单的涉及了关于相机如何跟随物体的移动而移动,如下代码: using Unit ...
- UWP中实现自定义标题栏
UWP中实现自定义标题栏 0x00 起因 在UWP开发中,有时候我们希望实现自定义标题栏,例如在标题栏中加入搜索框.按钮之类的控件.搜了下资料居然在一个日文网站找到了一篇介绍这个主题的文章: http ...
- Android中通过ActionBar为标题栏添加搜索以及分享视窗
在Android3.0之后,Google对UI导航设计上进行了一系列的改革,其中有一个非常好用的新功能就是引入的ActionBar,他用于取代3.0之前的标题栏,并提供更为丰富的导航效果.Action ...
- 【Win10 应用开发】自定义应用标题栏
Win 10 app对窗口标题栏的自定义包括两个层面:一是只定义标题中各部分的颜色,如标题栏上文本的颜色.三个系统按钮(最大化,最小化,关闭)的背景颜色等:另一层是把窗口的可视区域直接扩展到标题栏上, ...
- WinForm拖动没有标题栏窗体的方法
建立窗体的名称修改为:Form_HoverTree 文后附有源码下载. 主要代码: Point _HoverTreePosition; public Form_HoverTree() { Initia ...
- WPF 自定义标题栏 自定义菜单栏
自定义标题栏 自定义列表,可以直接修改WPF中的ListBox模板,也用这样类似的效果.但是ListBox是不能设置默认选中状态的. 而我们需要一些复杂的UI效果,还是直接自定义控件来的快 GitHu ...
随机推荐
- 二、linux题型
1.[root@pyrene ~]# 这里root是当前登录用户 @分割 pyrene是主机名 -:表示当前登录环境 #:表示管理员 2.在/data下面创建一个文件oldboy. ...
- 谈Swift中的访问控制
访问控制(Access Control) 访问控制可以限定其他源文件或模块中的代码对你的代码的访问级别.这个特性可以让我们隐藏代码的一些实现细节,并且可以指定一些代码和访问和使用的优先接口. 你可以明 ...
- inline-block和同级的text-align问题
https://www.cnblogs.com/qjqcs/p/5551640.html margin:0 auto:是设置块标签在父级中居中对齐,是一种对齐方式.所以对于display:inline ...
- Linux下Python科学计算包numpy和SciPy的安装
系统环境: OS:RedHat5 Python版本:Python2.7.3 gcc版本:4.1.2 各个安装包版本: scipy-0.11.0 numpy-1.6.2 nose-1.2.1 lap ...
- mysql中两表更新时产生的奇葩问题,产生死锁!
如下一个两表更新语句 UPDATE hzxm201610 a,xmhzylb1201610 b SET a.gk07_1_6=b.gk04_11,a.gk07_2_6=b.f06_1,a.gk07_3 ...
- mongod无法启动
今天遇到了一个奇葩问题,我在Linux系统里备份了数据库,结果不知道为什么,系统用不了了,后来经过同事的检查,发现原来是我的硬盘快满了,导致mongod数据无法启动,真是.......
- SpringCloud-路由网关(Zuul)
在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.只能路由.配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统. 在Spring Cloud ...
- openssl——初了解
Openssl OpenSSL是一个开源的.用于SSL/TLS协议的加密工具,是互联网加密传输的核心基础组件,由加拿大的Eric Yang等发起编写的,当前互联网安全传输的大部分场景(如HTTPS)均 ...
- WPF绑定数据源之RelativeSource
Command="{Binding ConfirmRegisterCommand}" CommandParameter="{Binding RelativeSource= ...
- Python爬虫之利用BeautifulSoup爬取豆瓣小说(一)——设置代理IP
自己写了一个爬虫爬取豆瓣小说,后来为了应对请求不到数据,增加了请求的头部信息headers,为了应对豆瓣服务器的反爬虫机制:防止请求频率过快而造成“403 forbidden”,乃至封禁本机ip的情况 ...