[Android UI开发] 固定在ScrollView顶部的View,类似于新浪微博的评论列表的顶部
2015-09-11 18:12
218 查看
现在很多App都实现了这个功能,例如新浪微博评论页面的评论、转发、赞的数字可以固定在屏幕上方。我个人很喜欢这种设计,所以利用一点空余时间简单实现了一个类似的功能。
先来看一下上面这张图的效果。
这个是新浪微博的一个页面,整体布局大致分了三块:正文内容、转发评论赞的数字条、评论列表
其中数字条是可以跟着ScrollView一起滑动,但在滑到最顶部时固定在最上面,而下面的评论内容可以继续滑动。
这种效果还是挺赞的,但一开始没有什么思路,所以就去搜了下相关技术代码,一下就恍然大悟!原来是自己想复杂了,其实原理很简单!
下面是自己实现的效果图:
实现原理:
当滚动条划过头部时,把需要固定的头部从父布局中移除,然后添加到最外层布局的顶部。
当滚动条返回时,又把最外层的头部移除,然后重新添加到原来的父布局里面。
整个实现代码,不算上布局,也就100行左右。
详细实现逻辑:
首先建一个自定义View叫MyHoveringScrollView继承自FrameLayout,在布局里MyHoveringScrollView处于最外层。由于FrameLayout本身是不支持滚动条的,所以在FrameLayout内部有一个自定义的ScrollView。
在初始化的时候,通过getChildAt(0)把子布局拿到,然后清空整个布局,然后实例化一个自己的ScrollView,把之前拿到的子布局添加到ScrollView里面,
最后把ScrollView添加到MyHoveringScrollView里面。
?
可能注意到了两点:
1、我用了post()。因为在构造方法里面布局还没有生成,getChildAt(0)是拿不到东西的,但是post()会把动作放到队列里,等布局完成后再从队列里取出来,所以这里是个小窍门。
2、我把MyHoveringScrollView传入到了ScrollView里面,这么做其实是为了让ScrollView回调MyHoveringScrollView的方法。(比较懒,不想写接口……)
然后通过setTopView()方法,把需要固定在顶部的ID传进来:
?
注意为什么要调用mTopView.setLayoutParams(),因为头部的布局高度必须得固定,如果是wrap_content,虽然也不会有什么错误,但效果不太好,可以自己试一下。
接下来,在ScrollView里面重写onScrollChanged()方法,并回调给MyHoveringScrollView的onScroll方法:
?
?
如果scrollY >= mTopViewTop就是头部应该被固定在顶部的时候
如果scrollY < mTopViewTop就是头部应该取消固定,还原到原来父布局的时候
至此,功能就实现了!
怎么使用呢?首先先写布局:
?
其中:MyHoveringScrollView在最外层,充当ScrollView的角色(所以子布局只能有一个)
android:id="@+id/top也就是需要固定在顶部的布局
最后回到Activity:
?
两句话就实现了固定头部的效果。
来自:http://my.oschina.net/Hideeee/blog/500933
先来看一下上面这张图的效果。
这个是新浪微博的一个页面,整体布局大致分了三块:正文内容、转发评论赞的数字条、评论列表
其中数字条是可以跟着ScrollView一起滑动,但在滑到最顶部时固定在最上面,而下面的评论内容可以继续滑动。
这种效果还是挺赞的,但一开始没有什么思路,所以就去搜了下相关技术代码,一下就恍然大悟!原来是自己想复杂了,其实原理很简单!
下面是自己实现的效果图:
实现原理:
当滚动条划过头部时,把需要固定的头部从父布局中移除,然后添加到最外层布局的顶部。
当滚动条返回时,又把最外层的头部移除,然后重新添加到原来的父布局里面。
整个实现代码,不算上布局,也就100行左右。
详细实现逻辑:
首先建一个自定义View叫MyHoveringScrollView继承自FrameLayout,在布局里MyHoveringScrollView处于最外层。由于FrameLayout本身是不支持滚动条的,所以在FrameLayout内部有一个自定义的ScrollView。
在初始化的时候,通过getChildAt(0)把子布局拿到,然后清空整个布局,然后实例化一个自己的ScrollView,把之前拿到的子布局添加到ScrollView里面,
最后把ScrollView添加到MyHoveringScrollView里面。
?
1、我用了post()。因为在构造方法里面布局还没有生成,getChildAt(0)是拿不到东西的,但是post()会把动作放到队列里,等布局完成后再从队列里取出来,所以这里是个小窍门。
2、我把MyHoveringScrollView传入到了ScrollView里面,这么做其实是为了让ScrollView回调MyHoveringScrollView的方法。(比较懒,不想写接口……)
然后通过setTopView()方法,把需要固定在顶部的ID传进来:
?
接下来,在ScrollView里面重写onScrollChanged()方法,并回调给MyHoveringScrollView的onScroll方法:
?
如果scrollY < mTopViewTop就是头部应该取消固定,还原到原来父布局的时候
至此,功能就实现了!
怎么使用呢?首先先写布局:
?
android:id="@+id/top也就是需要固定在顶部的布局
最后回到Activity:
?
来自:http://my.oschina.net/Hideeee/blog/500933
相关文章推荐
- [Android UI开发] Android常用工具类
- hdoj 1242 Rescue 【bfs】
- UITableView 分页显示、加载更多,数据源远程数据,解析JSON,以及iOS☞Category
- IOS开发UI展示之UITableView ──分页加载更多
- android Bluetooth程序设计
- UE4使用第三方库
- 将输出绑定到UITextView
- Qt5官方demo分析集11——Qt Quick Particles Examples - Affectors
- hdu 5400 Arithmetic Sequence
- Unique Binary Search Trees II
- Unique Binary Search Trees
- SDWebImage在UITableView部分CELL图片无法加载的解决办法
- 实战iOS 9:剖析UIKit Dynamics的改进
- Hello JSP!——request对象
- 3.3final中,bit.lshift报错nil value
- Spark Quick Start
- 深入消息机制(三) 结合MessageQueue 的JNI 层
- 13.GPUImage初探以及人脸检测
- UICollectionView
- 小试uiautomatorviewer