全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android中使用ScrollView指定view的顶部悬停效果

因项目中的需要实现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滚动的实例详解  # 重写  # 置顶  # 设置为  # 就不  # 就可以  # 状态栏  # 回调  # 来了  # 的是  # 都是  # 实现了  # 我也  # 是在  # 好了  # 换汤不换药  # 都在  # 很容易  # 我把  # 给大家  # 很重要 


相关文章: 长沙做网站要多少钱,长沙国安网络怎么样?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  如何彻底卸载建站之星软件?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  建站DNS解析失败?如何正确配置域名服务器?  ,如何利用word制作宣传手册?  如何访问已购建站主机并解决登录问题?  如何通过可视化优化提升建站效果?  建站之星2.7模板快速切换与批量管理功能操作指南  如何通过免费商城建站系统源码自定义网站主题与功能?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  学校建站服务器如何选型才能满足性能需求?  教程网站设计制作软件,怎么创建自己的一个网站?  如何获取PHP WAP自助建站系统源码?  建站主机是否等同于虚拟主机?  如何选择域名并搭建高效网站?  广州商城建站系统开发成本与周期如何控制?  建站之星安装失败:服务器环境不兼容?  Swift中循环语句中的转移语句 break 和 continue  建站主机选哪种环境更利于SEO优化?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  ,怎么用自己头像做动态表情包?  宁波免费建站如何选择可靠模板与平台?  小程序网站制作需要准备什么资料,如何制作小程序?  广州营销型建站服务商推荐:技术优势与SEO优化解析  网站网页制作专业公司,怎样制作自己的网页?  如何用搬瓦工VPS快速搭建个人网站?  网站制作需要会哪些技术,建立一个网站要花费多少?  已有域名和空间如何搭建网站?  早安海报制作网站推荐大全,企业早安海报怎么每天更换?  沈阳制作网站公司排名,沈阳装饰协会官方网站?  如何实现建站之星域名转发设置?  如何使用Golang table-driven基准测试_多组数据测量函数效率  常州自助建站:操作简便模板丰富,企业个人快速搭建网站  建站主机选哪家性价比最高?  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  c# 在高并发场景下,委托和接口调用的性能对比  单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?  为什么Go需要go mod文件_Go go mod文件作用说明  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  网站制作软件免费下载安装,有哪些免费下载的软件网站?  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  建站之星代理商如何保障技术支持与售后服务?  非常酷的网站设计制作软件,酷培ai教育官方网站?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  如何用AWS免费套餐快速搭建高效网站?  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  建站主机CVM配置优化、SEO策略与性能提升指南 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。