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

Android中使用ScrollView指定view的顶部悬停效果,第1张

概述因项目中的需要实现ScrollView顶部悬停,也不是太难便自己实现功能,话不多说,先上效果图

因项目中的需要实现ScrollVIEw顶部的悬停,也不是太难便自己实现功能,话不多说,先上效果图

红色text一到顶上便会悬浮在上面,不会跟随scrollvIEw的滑动而上滑。

原理:@H_419_12@

原理其实很简单就是对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,oldy);    }  }  public interface ScrollVIEwListener {    voID onScrollChanged(ScrollVIEw scrollVIEw,int x,int oldy);  }}

我把重写的ScrollVIEw命名为ObservableScrollVIEw,重写三个构造方法,都是换汤不换药的作法,这里就不赘述。 最重要的是重写onScrollChanged这个方法,如何把滑动监听事件开放出去呢,其实也就是写一个监听回调,参数和onScrollChanged里面的的参数一样就可以了,当然主要不是用到这些参数,只是为了判断ScrollVIEw的滑动事件,参数对于这个功并不是很重要。那这样,一个简单的自定义就写好了scrollvIEw

如何去用?@H_419_12@

用法也是挺简单的,直接上代码

@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 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替代就可以了

结论:@H_419_12@

实现这种效果,找对了思路就可以很容易的写出来了,这是一种比较简单的实现方式了,源码我就不贴出来了,基本已经都在了。

以上所述是小编给大家介绍的AndroID中使用ScrollVIEw指定vIEw的悬停效果,希望对大家有所帮助。。。

总结

以上是内存溢出为你收集整理的Android中使用ScrollView指定view的顶部悬停效果全部内容,希望文章能够帮你解决Android中使用ScrollView指定view的顶部悬停效果所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1149673.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存