仿美团app,浮动layout滑动到顶部悬停效果

原文地址:http://www.eoeandroid.com/thread-558736-1-1.html

  说明
今天在帖子上看到有人需要做一个类似美团app的一个效果,就是当一个浮动layout的滑动到顶部时,这个浮动layout就悬停下来,当屏幕往下滑动时,浮动layout也跟着往下移动。
       因此,我特意也写了一个:浮动layuot滑动到顶部悬停demo,下图:
 
   原理
        好,看完效果图之后,我们来看一下这个效果的设计原理。
        首先,我们来看一张整体的设计图:
  
设计效果图是分为三个部分:顶部区域、浮动区域A、列表区域。
1.当屏幕往上面滑动的时候,互动区域A也跟着滑动;
2.当浮动区域A滑动到顶部的时候,浮动区域A停留在顶部(上右图);
3.当屏幕往下滑动的时候,浮动区域A也跟着往下滑动。
这是整个滑动的效果流程。

那么,这时问题来了。怎么能让浮动区域A停在顶部,而且不影响其他内容的滑动呢?
在这里我们可以写多一个和浮动区域A界面效果一模一样的浮动区域B。在布局的时候,先把浮动区域B的可见性设置为gone,即隐藏起来。当浮动区域A滑动到顶部的时候,就把浮动区域B的可见性设置为VISIBLE,即可见。这时浮动区域B会覆盖在整个屏幕的上面,即使整个屏幕在滑动的时候也不会影响浮动区域B的位置,那么看起来就好像浮动区域A是停留在顶部位置不动了,见下图。
 
(此时,设置浮动区域B的可见性为VISIBLE,即可见)

同理,当整个屏幕往下滑动的时候,再把浮动区域B的可见性设置为GONE,那么看起来的效果就好像浮动区域A又重新滑动起来了。

这个原理大家应该可以理解吧!

    实现过程
       说完原理之后,让我们来看看在代码里面是怎么实现这个过程的。
我们先看看布局文件activity_main.xml
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2.     xmlns:tools="http://schemas.android.com/tools"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent"
  5.     tools:context=".MainActivity" >

  6.     <com.jimstin.topfloatdemo.view.MyScrollView
  7.         android:id="@+id/scroll_view"
  8.         android:layout_width="match_parent"
  9.         android:layout_height="match_parent">
  10.         <LinearLayout 
  11.             android:layout_width="match_parent"
  12.             android:layout_height="wrap_content"
  13.             android:orientation="vertical">
  14.             <ImageView 
  15.                 android:id="@+id/image_view"
  16.                 android:layout_width="match_parent"
  17.                 android:layout_height="wrap_content"
  18.                 android:background="@drawable/pic01"/>
  19.            <LinearLayout 
  20.                 android:layout_width="match_parent"
  21.                 android:layout_height="wrap_content"
  22.                 android:orientation="horizontal"
  23.                 android:background="#f6e4c0">
  24.                 <TextView 
  25.                     android:layout_width="0dp"
  26.                     android:layout_height="wrap_content"
  27.                     android:layout_weight="1"
  28.                     android:textSize="10pt"
  29.                     android:text="可乐鸡翅  55元"
  30.                     android:textColor="#e68b4e"/>
  31.                 <Button 
  32.                     android:layout_width="wrap_content"
  33.                     android:layout_height="wrap_content"
  34.                     android:text="立即购买"
  35.                     android:textColor="#ffffff"/>
  36.             </LinearLayout>
  37.             <ListView 
  38.                 android:id="@+id/list_view"
  39.                 android:layout_width="match_parent"
  40.                 android:layout_height="0dp"
  41.                 android:layout_weight="1">
  42.                 
  43.             </ListView>
  44.             
  45.         </LinearLayout>
  46.     </com.jimstin.topfloatdemo.view.MyScrollView>

  47.     <LinearLayout 
  48.          android:id="@+id/flow_llay"
  49.          android:layout_width="match_parent"
  50.          android:layout_height="wrap_content"
  51.          android:orientation="horizontal"
  52.          android:background="#f6e4c0"
  53.          android:visibility="gone">
  54.          <TextView 
  55.               android:layout_width="0dp"
  56.               android:layout_height="wrap_content"
  57.               android:layout_weight="1"
  58.               android:textSize="10pt"
  59.               android:text="可乐鸡翅  55元"
  60.               android:textColor="#e68b4e"/>
  61.           <Button 
  62.               android:layout_width="wrap_content"
  63.               android:layout_height="wrap_content"
  64.               android:text="立即购买"
  65.               android:textColor="#ffffff"/>
  66.      </LinearLayout>
  67. </RelativeLayout>
复制代码


布局文件效果:
 
顶部的“可乐鸡翅”就是刚刚所说的浮动区域B,中间的“可乐鸡翅”则是浮动区域A,布局文件应该不难理解。
那么我们怎么知道何时隐藏、显示顶部的浮动layout呢?
 
由于整体的布局内容都是放在一个自定义的ScrollView里面。所以,只要我们在ScrollView里面判断:
      当Scrollview向上滑动的距离大于等于顶部区域的高度时,也就是浮动区域A的顶边贴到屏幕顶部的时候,这是将浮动区域B的可见性设置为VISIBLE即可,否则设置为GONE即可。
      这样就实现了我们想要的效果了。
关键代码:
  1. @Override
  2.         protected void onScrollChanged(int l, int t, int oldl, int oldt) {
  3.                 
  4.                 super.onScrollChanged(l, t, oldl, oldt);
  5.                 if(mTopView != null) {
  6.                         if(t >= mTopView.getHeight()) {
  7.                                 mFlowView.setVisibility(View.VISIBLE);
  8.                         } else {
  9.                                 mFlowView.setVisibility(View.GONE);
  10.                         }
  11.                 }
  12.         }
复制代码
代码的意思是,当ScrollView向上滚动的高度大于等于mTopView顶部区域的高度时,那么就将mFlowView浮动layout的可见性设置为VISIBLE,否则设置为GONE。
那么这个判读是在哪里的呢?
其实这个方法是在自定义的ScrollView里面的,可能这里就有人疑问,为什么要自定义ScrollView?因为onScrollChange方法是一个protected的方法,直接使用ScrollView是使用不了该方法的。

其他的代码就不解释了,大家可以下载项目来亲自测试,有问题欢迎留言!



无标题.png (17.61 KB, 下载次数: 2)

无标题.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值