Android中使用ScrollView指定view的顶部悬停效果
发布时间 - 2026-01-11 00:34:48 点击率:次因项目中的需要实现ScrollView顶部的悬停,也不是太难便自己实现功能,话不多说,先上效果图
红色text一到顶上便会悬浮在上面,不会跟随scrollview的滑动而上滑。
原理:
原理其实很简单就是对view的gone和visible,写两个相同的要置顶的view,一个设置为gone,一个为visible,当可见的view超出屏幕范围的时候,将不可以的view设置为visible,不可见的view 与scrollview要同级,这样滑动的时候不会影响到view的位置。
直接上代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.lanmai.ObservableScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scrollview"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- 中间就是填充的view就不写了-->
<!--指定要置顶的view-->
<TextView
android:id="@+id/specific_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/holo_red_dark"
android:gravity="center"
android:text="text"
android:textSize="40sp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="@android:color/darker_gray"
android:gravity="center"
android:text="text"
android:textSize="40sp"/>
</LinearLayout>
</RelativeLayout>
</com.lanmai.ObservableScrollView>
<!--指定要置顶的相同的view visibility设置为gone -->
<TextView
android:id="@+id/specific_text_view_gone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/holo_red_dark"
android:gravity="center"
android:text="text"
android:textSize="40sp"
android:visibility="gone"/>
</RelativeLayout>
接下来要重写scrollview,为什么要重写ScrollView,scrollview的滑动监听事件setOnScrollChangeListener 这个方法是在6.0以上才能用的。为了考虑低版本的的需求,要重写ScrollView把接口开放出来。
重写ScrollView
public class ObservableScrollView extends ScrollView {
private ScrollViewListener scrollViewListener = null;
public ObservableScrollView(Context context) {
super(context);
}
public ObservableScrollView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
}
public ObservableScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setScrollViewListener(ScrollViewListener scrollViewListener) {
this.scrollViewListener = scrollViewListener;
}
@Override
protected void onScrollChanged(int x, int y, int oldx, int oldy) {
super.onScrollChanged(x, y, oldx, oldy);
if (scrollViewListener != null) {
scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
}
}
public interface ScrollViewListener {
void onScrollChanged(ScrollView scrollView, int x, int y, int oldx, int oldy);
}
}
我把重写的ScrollView命名为ObservableScrollView,重写三个构造方法,都是换汤不换药的作法,这里就不赘述。 最重要的是重写onScrollChanged这个方法,如何把滑动监听事件开放出去呢,其实也就是写一个监听回调,参数和onScrollChanged里面的的参数一样就可以了,当然主要不是用到这些参数,只是为了判断ScrollView的滑动事件,参数对于这个功并不是很重要。那这样,一个简单的自定义就写好了scrollview
如何去用?
用法也是挺简单的,直接上代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scroll_view);
mTextView = ((TextView) findViewById(R.id.specific_text_view));
mScrollView = ((ObservableScrollView) findViewById(R.id.scrollview));
mVisibleTextView = ((TextView) findViewById(R.id.specific_text_view_gone));
mTextView.setOnClickListener(this);
mScrollView.setScrollViewListener(this);
}
这里onCreate方法里面的,也简单,拿到view 并且设置监听事件,当然,这里多实现了一个点击view置顶的功能,监听设置好以后,实现相应的接,接下来就是重头戏了
@Override
public void onScrollChanged(ScrollView scrollView, int x, int y, int oldx, int oldy) {
int[] location = new int[2];
mTextView.getLocationOnScreen(location);
int xPosition = location[0];
int yPosition = location[1];
Log.d("ScrollViewActivity", "yPosition:" + yPosition);
int statusBarHeight = getStatusBarHeight();
Log.d("ScrollViewActivity", "statusBarHeight:" + statusBarHeight);
if (yPosition <= statusBarHeight) {
mVisibleTextView.setVisibility(View.VISIBLE);
} else {
mVisibleTextView.setVisibility(View.GONE);
}
}
onScrollChanged这个方法就是自己写的监听回调,里面的参数就是Scrollview滑动的时候回调出来的,里面的参数并不用去关心
int[] location = new int[2];
mTextView.getLocationOnScreen(location);
int xPosition = location[0];
int yPosition = location[1];
/* mTextView就是要悬浮的view,getLocationOnScreen(location)这个方法就是拿到view在屏幕中的位置 ,传入一个数组,最后得到的yPosition就是view在屏幕中的高度,这里面调用了native层的实现方式,所以数组能直接附上值*/
// 值得注意的是,拿到的这个高度还包括状态栏的高度。只要减掉就可以了,状态栏的高度获取获取附上代码:
public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
int statusBarHeight = getStatusBarHeight();
Log.d("ScrollViewActivity", "statusBarHeight:" + statusBarHeight);
通过获取到的状态栏高度,如果小于状态栏的高度就表示已经滑出屏幕了,将要置顶的view设置为visibvle否则设置为gone
if (yPosition <= statusBarHeight) {
mVisibleTextView.setVisibility(View.VISIBLE);
} else {
mVisibleTextView.setVisibility(View.GONE);
}
这样scrollview的悬浮置顶的功能就实现了,这里我也给出点击view置顶的代码
@Override
public void onClick(View v) {
int[] location = new int[2];
v.getLocationOnScreen(location);
int x = location[0];
int y = location[1];
mScrollView.scrollBy(0, location[1] - getStatusBarHeight());
}
当然要缓慢的滑动过程用smoothScrollBy替代就可以了
结论:
实现这种效果,找对了思路就可以很容易的写出来了,这是一种比较简单的实现方式了,源码我就不贴出来了,基本已经都在了。
以上所述是小编给大家介绍的Android中使用ScrollView指定view的悬停效果,希望对大家有所帮助。。。
# android中scrollview
# scrollview顶部悬停
# Android垂直滚动控件ScrollView使用方法详解
# Android ScrollView实现下拉弹回动画效果
# android scrollview 自动滚动到顶部或者底部的实例
# android scrollview 滑动到顶端或者指定位置的实现方法
# Android 控制ScrollView滚动的实例详解
# 重写
# 置顶
# 设置为
# 就不
# 就可以
# 状态栏
# 回调
# 来了
# 的是
# 都是
# 实现了
# 我也
# 是在
# 好了
# 换汤不换药
# 都在
# 很容易
# 我把
# 给大家
# 很重要
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)
如何在阿里云购买域名并搭建网站?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
浅谈redis在项目中的应用
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
深圳网站制作的公司有哪些,dido官方网站?
免费视频制作网站,更新又快又好的免费电影网站?
php做exe能调用系统命令吗_执行cmd指令实现方式【详解】
JS碰撞运动实现方法详解
如何用免费手机建站系统零基础打造专业网站?
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
公司门户网站制作流程,华为官网怎么做?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
Laravel怎么实现模型属性的自动加密
Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
青岛网站建设如何选择本地服务器?
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
Laravel如何使用Sanctum进行API认证?(SPA实战)
Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道
javascript读取文本节点方法小结
如何解决hover在ie6中的兼容性问题
如何快速打造个性化非模板自助建站?
如何快速搭建高效WAP手机网站?
香港服务器租用费用高吗?如何避免常见误区?
php结合redis实现高并发下的抢购、秒杀功能的实例
详解jQuery中基本的动画方法
如何用PHP快速搭建CMS系统?
网站制作软件有哪些,制图软件有哪些?
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
JS实现鼠标移上去显示图片或微信二维码
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
Laravel distinct去重查询_Laravel Eloquent去重方法
如何快速搭建个人网站并优化SEO?
高防服务器租用如何选择配置与防御等级?

