文档章节

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

谁带我去看看世界
 谁带我去看看世界
发布于 2015/06/16 17:41
字数 1233
阅读 5574
收藏 30

做了个类似美团app的一个效果

 

当一个浮动layout的滑动到顶部时,这个浮动layout就悬停下来,当屏幕往下滑动时,浮动layout也跟着往下移动。

       因此,我特意也写了一个:浮动layuot滑动到顶部悬停demo,下图:

(妈蛋上传图片不能超过200k,只能把图片阉割成这样,凑合着看吧)

 

 

 

原理
        好,看完效果图之后,我们来看一下这个效果的设计原理。
        首先,我们来看一张整体的设计图:

 

 

 

 

 

 

 

设计效果图是分为三个部分:顶部区域、浮动区域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

 

 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <com.jimstin.topfloatdemo.view.MyScrollView
        android:id="@+id/scroll_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
            <ImageView
                android:id="@+id/image_view"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@drawable/pic01"/>
           <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:background="#f6e4c0">
                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:textSize="10pt"
                    android:text="可乐鸡翅  55元"
                    android:textColor="#e68b4e"/>
                <Button
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="立即购买"
                    android:textColor="#ffffff"/>
            </LinearLayout>
            <ListView
                android:id="@+id/list_view"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1">
               
            </ListView>
           
        </LinearLayout>
    </com.jimstin.topfloatdemo.view.MyScrollView>

    <LinearLayout
         android:id="@+id/flow_llay"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:orientation="horizontal"
         android:background="#f6e4c0"
         android:visibility="gone">
         <TextView
              android:layout_width="0dp"
              android:layout_height="wrap_content"
              android:layout_weight="1"
              android:textSize="10pt"
              android:text="可乐鸡翅  55元"
              android:textColor="#e68b4e"/>
          <Button
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="立即购买"
              android:textColor="#ffffff"/>
     </LinearLayout>
</RelativeLayout>

 

 

布局文件效果

 

 

顶部的“可乐鸡翅”就是刚刚所说的浮动区域B,中间的“可乐鸡翅”则是浮动区域A,布局文件应该不难理解。
那么我们怎么知道何时隐藏、显示顶部的浮动layout呢?

 

 

由于整体的布局内容都是放在一个自定义的ScrollView里面。所以,只要我们在ScrollView里面判断:
      当Scrollview向上滑动的距离大于等于顶部区域的高度时,也就是浮动区域A的顶边贴到屏幕顶部的时候,这是将浮动区域B的可见性设置为VISIBLE即可,否则设置为GONE即可。
      这样就实现了我们想要的效果了。
关键代码:

 

@Override
        protected void onScrollChanged(int l, int t, int oldl, int oldt) {
               
                super.onScrollChanged(l, t, oldl, oldt);
                if(mTopView != null) {
                        if(t >= mTopView.getHeight()) {
                                mFlowView.setVisibility(View.VISIBLE);
                        } else {
                                mFlowView.setVisibility(View.GONE);
                        }
                }
        }

 

代码的意思是,当ScrollView向上滚动的高度大于等于mTopView顶部区域的高度时,那么就将mFlowView浮动layout的可见性设置为VISIBLE,否则设置为GONE。
那么这个判读是在哪里的呢?

 

 


其实这个方法是在自定义的ScrollView里面的,可能这里就有人疑问,为什么要自定义ScrollView?因为onScrollChange方法是一个protected的方法,直接使用ScrollView是使用不了该方法的。

 

好的,今天的分享就到此为止!

 

如果大家喜欢就请多多支持我博客的文章,我会尽量抽时间来分享干货!!嫩们的支持是仁家的动力!!!

 

1       想要盈利吗?想,就对了

2       android 开发赚钱

 

这是在我的博客点击率最高的两篇文章,看来大家还是对赚钱感兴趣啊,有需要的朋友可以去看看,不用谢,我是雷锋,嘻嘻!!!

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
谁带我去看看世界
粉丝 11
博文 11
码字总数 12762
作品 0
广州
私信 提问
加载中

评论(4)

C
C0612
雷锋同志,我要带你去看看世界
太阳bb
太阳bb
zan····zan····zan····zan····zan····zan····zan····zan····zan····zan····zan····
这个杀手不太冷额
好东西,谢谢楼主
Android5.0+(CoordinatorLayout)

英文原文:https://guides.codepath.com/android/Handling-Scrolls-with-CoordinatorLayout 这篇文章专门讲解和CoordinatorLayout相关的知识点,这也是Design Support Library中最重要与最难...

让代码飞一会
2015/07/28
0
0
仿知乎首页学习 CoordinateLayout

前言 第一次接触CoordinateLayout的时候深深的被其炫酷的特效所吸引;想着什么时候在实际项目中可以使用一下,无奈实际项目因行业特点,并不需要使用到CoordinateLayout这么高端的交互体验;...

IAM四十二
2016/12/22
0
0
高仿新浪微博客户端(未完待续)

高仿新浪微博手机客户端。目前更新到第二期,实现的功能包括: 1. 微博首页列表布局,即UITableViewCell的自定义; 2. 自定义导航栏(UINavigationBar)上的控件; 3. 点击导航栏(UINavigat...

匿名
2013/04/13
4.3K
0
「iOS」高仿【少数派】客户端 代码+思路讲解

少数派 一、写在前面 在我的iOS开发学习过程中,阅读过许多同学的高仿项目文章、源码,对我助益颇深。但是许许多多的高仿项目在技术方面各有侧重,所以我先把本项目中值得探讨的技术点列出,...

halohily
2017/09/13
0
0
Android 滑动定位+吸附悬停效果实现

在前两篇文章中,分别介绍了tablayout+scrollview 和 tablayout+recyclerview 实现的滑动定位的功能,文章链接: Android 实现锚点定位 Android tabLayout+recyclerView实现锚点定位 仔细看的...

程序猿tx
08/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

redis数据结构

redis不只是一个简单的键(key)-值(value)数据库,实际上它是一个数据结构服务器,支持各种类型的值。也就是说,在传统的键-值数据库中,你把字符串键与字符串值联系起来,而在redis,值不仅限...

hblt-j
10分钟前
2
0
MySQL事务的的介绍及使用

1. 事务的特性 1.1 原子性(Atomicity): 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 1.2. 一致性(Consistency): 在一个事务中,事务的前后数据的完...

kuchawyz
16分钟前
1
0
[sed] 将 the 和 statement 之间的单词变为全大写

-bash-4.1$ cat textfind the Match statementConsult the Get statementusing the Read statement to retrieve data-bash-4.1$ cat sedsrc1/the .* statement/{hs/.*the (.......

圣洁之子
17分钟前
1
0
curl 编译安装(openssl)

//依赖安装yum install openssl openssl-develwget https://curl.haxx.se/download/curl-7.63.0.tar.gztar -zvxf curl-7.63.0.tar.gzcd curl-7.63.0./configure --prefix=......

colin_86
17分钟前
2
0
Canvas之使用图片

canvas有比较强的图片操作能力。可以用于动态的图像合成或者作为图形的背景。浏览器支持任意格式如PNG、GIF、或者JPEG,你甚至可以将同一个页面中的其他canvas元素生成的图片作为图片源(toDa...

tianyawhl
19分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部