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

这种方法在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实现“跟随标题栏”的更多相关文章

  1. PyQt:无边框自定义标题栏及最大化最小化窗体大小调整

    环境 Python3.5.2 PyQt5 陈述 隐藏掉系统的控制栏,实现了自定义的标题控制栏,以及关闭/最大化/最小化的功能,自由调整窗体大小的功能(跟随一个大佬学的),代码内有详细注释 只要把Mai ...

  2. Android ViewPager+HorizontalScrollView实现标题栏滑动(腾讯新闻)

    1) ViewPager提供了左右滑动切换页面的方法,但是它所提供的标题只是无语,估计没有真正的项目会照搬拿过来;并且它只能一页一页滑,我想直接查看最后一页要滑半天; 2) 看了腾讯新闻客户端感觉体验 ...

  3. c# 窗体相关操作(最大化/最小化/关闭/标题栏)

    /// <summary> /// 窗体跟随鼠标移动的标记 /// </summary> private bool normalmoving = false; /// < ...

  4. Unity3d学习 相机的跟随

    最近在写关于相机跟随的逻辑,其实最早接触相机跟随是在Unity官网的一个叫Roll-a-ball tutorial上,其中简单的涉及了关于相机如何跟随物体的移动而移动,如下代码: using Unit ...

  5. UWP中实现自定义标题栏

    UWP中实现自定义标题栏 0x00 起因 在UWP开发中,有时候我们希望实现自定义标题栏,例如在标题栏中加入搜索框.按钮之类的控件.搜了下资料居然在一个日文网站找到了一篇介绍这个主题的文章: http ...

  6. Android中通过ActionBar为标题栏添加搜索以及分享视窗

    在Android3.0之后,Google对UI导航设计上进行了一系列的改革,其中有一个非常好用的新功能就是引入的ActionBar,他用于取代3.0之前的标题栏,并提供更为丰富的导航效果.Action ...

  7. 【Win10 应用开发】自定义应用标题栏

    Win 10 app对窗口标题栏的自定义包括两个层面:一是只定义标题中各部分的颜色,如标题栏上文本的颜色.三个系统按钮(最大化,最小化,关闭)的背景颜色等:另一层是把窗口的可视区域直接扩展到标题栏上, ...

  8. WinForm拖动没有标题栏窗体的方法

    建立窗体的名称修改为:Form_HoverTree 文后附有源码下载. 主要代码: Point _HoverTreePosition; public Form_HoverTree() { Initia ...

  9. WPF 自定义标题栏 自定义菜单栏

    自定义标题栏 自定义列表,可以直接修改WPF中的ListBox模板,也用这样类似的效果.但是ListBox是不能设置默认选中状态的. 而我们需要一些复杂的UI效果,还是直接自定义控件来的快 GitHu ...

随机推荐

  1. HashSet,TreeSet和LinkedHashSet的区别

    1. Set接口 Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false. Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就是说,只要两个 ...

  2. 20165101刘天野 2017-2018-2 《Java程序设计》第7周学习总结

    #20165101刘天野 2017-2018-2 <Java程序设计>第7周学习总结 教材学习内容总结 第十一章JDBC与MySQL数据库 JDBC简介 JDBC(Java Databas ...

  3. 【iOS和HTML 5交互】iOS中加载html5调用html方法和修改html5内容

    近期项目开发中用到了这方面的技术了,那我们一起来看看. 1.利用webView控件加载本地html5或者网络上html5 2.设置控制器为webView的代理,遵守协议 3.实现代理方法webView ...

  4. Android系统--输入系统(一)必备的Linux知识_inotify和epoll

    Android系统--输入系统(一)必备的Linux知识_inotify和epoll 引入 1. 笔记本电脑插入外接键盘,两个键盘都可以使用 a. 键盘即插即用--如何检测键盘的接入和拔出 hotpl ...

  5. Kubernetes Heapster

    Heapster是容器集群监控和性能分析工具,HPA.Dashborad.Kubectl top都依赖于heapster收集的数据. 但是Heapster从kubernetes 1.8以后已经被遗弃了 ...

  6. linux环境下的python安装过程(含setuptools)

    这里我不想采用诸如ubuntu下的apt-get install方式进行python的安装,而是在linux下采用源码包的方式进行python的安装. 一.下载python源码包 打开ubuntu下的 ...

  7. Lucene简单介绍

    [2016.6.11]以前写的笔记,拿出来放到博客里面~ 相关软件: Solr, IK Analyzer, Luke, Nutch;Tomcat; 1.是什么: Lucene是apache软件基金会j ...

  8. Java执行过程

    Java的运行原理 在Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器.这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口.编译程序只需要面向虚拟机,生成虚拟机能 ...

  9. intellij idea build时出现Artifact contains illegal characters的解决

    此处无法创建是因为Artifact的命名为大小写混合,将大写改为小写即可正常创建

  10. SQL Server中的执行引擎入门

      简介 当查询优化器(Query Optimizer)将T-SQL语句解析后并从执行计划中选择最低消耗的执行计划后,具体的执行就会交由执行引擎(Execution Engine)来进行执行.本文旨在 ...