不知从某某时间開始,这样的效果開始在UI设计中流行起来了。让我们先来看看效果:

大家在支付宝、美团等非常多App中都有使用。要实现这个效果,我们能够来分析下思路:

我们肯定要用2个一样的布局来显示我们的粘至布局。一个是正常的、还有一个是到顶部不动的。正常的那个,随着scroll一起滚,该滚到哪滚到哪。仅仅是他滚到最上面的时候,

我们须要用粘至的布局,放到顶部。当然。他还在后面继续滚,ok。如今我们来看看详细怎样实现:

先看布局,just a demo。用几张图片略微做做样子。

粘至布局:

<?

xml version="1.0" encoding="UTF-8"?

> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="50dp" android:orientation="horizontal" > <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:textColor="#FFFFFF" android:background="#232323" android:text="我不会动" android:textSize="30dp" /> </LinearLayout>

主布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/parent_layout"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><com.xys.scrolltrick.TrickScrollandroid:id="@+id/scrollView"android:layout_width="fill_parent"android:layout_height="fill_parent" ><FrameLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical" ><ImageViewandroid:id="@+id/iamge"android:layout_width="match_parent"android:layout_height="200dp"android:background="@drawable/ic_launcher"android:scaleType="centerCrop" /><includeandroid:id="@+id/stick"layout="@layout/stick_layout" /><ImageViewandroid:layout_width="match_parent"android:layout_height="200dp"android:background="@drawable/ic_launcher"android:scaleType="centerCrop" /><ImageViewandroid:layout_width="match_parent"android:layout_height="200dp"android:background="@drawable/ic_launcher"android:scaleType="centerCrop" /><ImageViewandroid:layout_width="match_parent"android:layout_height="200dp"android:background="@drawable/ic_launcher"android:scaleType="centerCrop" /></LinearLayout><includeandroid:id="@+id/normal"layout="@layout/stick_layout" /></FrameLayout></com.xys.scrolltrick.TrickScroll></LinearLayout>

加入多个imageview是为了让他能滚起来

因为ScrollView中并没有提供scroll listener,因此我们仅仅能重写下,来创建一个接口:

package com.xys.scrolltrick;import android.content.Context;
import android.util.AttributeSet;
import android.widget.ScrollView;public class TrickScroll extends ScrollView {public interface onScrollListener {public void onScroll(int scrollY);}private onScrollListener onScrollListener;public TrickScroll(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}public TrickScroll(Context context, AttributeSet attrs) {super(context, attrs);}public TrickScroll(Context context) {super(context);}public void setOnScrollListener(onScrollListener onsScrollListener) {this.onScrollListener = onsScrollListener;}@Overrideprotected void onScrollChanged(int l, int t, int oldl, int oldt) {super.onScrollChanged(l, t, oldl, oldt);if (onScrollListener != null) {onScrollListener.onScroll(t);}}
}

我们给他的滑动。提供一个监听接口。

主程序:

package com.xys.scrolltrick;import android.app.Activity;
import android.os.Bundle;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.LinearLayout;import com.xys.scrolltrick.TrickScroll.onScrollListener;public class MainActivity extends Activity implements onScrollListener {private TrickScroll mScroll;// 正常状态下的布局private LinearLayout mLayout1;// 顶部粘至的布局private LinearLayout mLayout2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mScroll = (TrickScroll) findViewById(R.id.scrollView);mLayout1 = (LinearLayout) findViewById(R.id.stick);mLayout2 = (LinearLayout) findViewById(R.id.normal);mScroll.setOnScrollListener(this);// 根布局状态下。监听布局改变findViewById(R.id.parent_layout).getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {onScroll(mScroll.getScrollY());}});}@Overridepublic void onScroll(int scrollY) {// 获取正常布局的位置来又一次设置粘至布局的位置int layoutTop = Math.max(scrollY, mLayout1.getTop());mLayout2.layout(0, layoutTop, mLayout2.getWidth(),layoutTop + mLayout2.getHeight());}
}

当中的核心就在onScroll(int scrollY)这种方法中。我们用max函数来推断当前最大值

这里须要注意2个方法:

1、getTop():该方法返回该view到容器的top像素

2、getScrollY():该方法返回的是。你的scrollview已经滚了多少

-------------------一旦这个世界有了scroll整个世界就不一样了-------------------

知道了这2个方法后。我们就能够推断了,当滚的距离小于getTop()的时候。保持与正常的一样,大于的时候,就须要用getScrollY()了,这个比較难理解,事实上你能够把布局想象成一个纸带,而手机屏幕是一个挖了孔的框,我们在后面从下往上拉纸带,这样就模拟了scroll滑动,这样理解的话,会比較清楚点

以上。

转载于:https://www.cnblogs.com/blfbuaa/p/7077769.html

Android顶部粘至视图具体解释相关推荐

  1. 给 Android 开发人员的 RxJava 具体解释

    前言 我从去年開始使用 RxJava .到如今一年多了. 今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava .并且使用的场景越来越多 . 而 ...

  2. android标题栏渐变动画,Android 顶部标题栏随滑动时的渐变隐藏和渐变显示效果

    各位早上好,话不多说,先上效果图: 注意顶部:首页textview的变化(显示和隐藏)! 首先分析下:ui状态,其是由recyclerview添加头部组成+recyclerview 头部添加和recy ...

  3. myeclipse中导入android项目后无法视图下查看XML视图

    myeclipse中导入android项目后无法视图下查看XML视图 导入项目后重启myeclipse即可,打开xml文件便可视图预览.

  4. android华为虚拟截屏黑屏,Android截屏表面视图显示黑屏

    Android截屏表面视图显示黑屏 我试图通过代码拍摄我的游戏的截图,并通过一个意图来分享它.我能做这些事情,但是截图总是看起来是黑色的.下面是与分享截图相关的代码:View view = MainA ...

  5. android 文本分页显示,Android查看带有列表视图的分页器并动态添加文本

    我在一个分片活动中有一个Viewpager,它有一个带有编辑文本和发送按钮的botton框架. 在片段布局中,我有一个ListView,并在片段中附加了一个适配器.现在我正在实现从片段中的Parent ...

  6. android中 menu的属性详细解释

    android中 menu的属性详细解释 <?xml version="1.0" encoding="utf-8"?> <menu xmlns ...

  7. Android客户端请求服务器端的详细解释(附源代码)

    Android客户端请求服务器端的详细解释 1. Android客户端与服务器端通信方式: Android与服务器通信通常采用HTTP通信方式和Socket通信方式,而HTTP通信方式又分get和po ...

  8. Android Studio 中列表视图(ListView)的应用

    目录 引言 一.列表视图的作用 二.列表视图的工作原理和工作方式 三.准备数据源 四.适配器的使用 五.布局文件中的列表视图 六.自定义列表项布局 七.列表项点击事件处理 八.列表的优化 十.示例代码 ...

  9. 安卓Android手机系统内文件夹目录解释

    Bluestorm's Space 博客园 首页 新随笔 联系 订阅 管理 随笔- 423 文章- 3 评论- 58  /storage/sdcard, /sdcard, /mnt/sdcard 三者 ...

最新文章

  1. Owncloud-X安装配置
  2. python asyncio tcp转发_aiohttp + asyncio 异步网络请求基本操作
  3. css flex 小记
  4. Maven知识- repositories
  5. Unit25 Congratulation
  6. 「mysql优化专题」90%程序员面试都用得上的索引优化手册(5)
  7. 软件推荐:Microsoft To-Do
  8. 聊聊 Java 面试的一些坑
  9. 几种调用WebService的方法
  10. Qlocker勒索病毒 7Z勒索病毒 7Z压缩包密码破解
  11. WhereHows解读
  12. 使用 SVI 实现 VLAN 间路由
  13. 易语言 实现程序被关闭时隐藏窗口
  14. 金叉成功率_曝光MACD零轴上的秘密:“0线下方金叉买入”千万别小看,成功率达100%!...
  15. 神经网络的反向传播算法中矩阵的求导方法(矩阵求导总结)
  16. CALLBACK / 回调(diao)
  17. 你的选择,决定了你过怎样的生活
  18. Golang go-svc包源码分析
  19. PHP字符串函数stripslashes(反引用一个addslashes转义的字符串)
  20. 修改IP的cmd命令

热门文章

  1. 为什么a*算法采用哈密尔顿距离作为启发函数比不在位数为启发函数的性能要好?_【论文研读】路径规划中的Hybrid A*算法...
  2. linux挂载fat分区,[实例]用fstab在Linux下自动挂载Win的FAT和NTFS分区
  3. springcloud 之 EurekaServer 服务注册集群
  4. 哇靠靠,这也行?零基础DIY无人驾驶小车(三)
  5. [深度学习] Pytorch中RNN/LSTM 模型小结
  6. 【Clion-Ubuntu-dlib】运行一个dlib案例(一)(如何在clion编译器中配置CMakeLists)
  7. 这一两天要做的事--关于Altera FPGA首先要搞清楚的几个问题 以及解答
  8. 来自天秤座的梦想_天秤座:单线全自动机器学习
  9. 使用composer_在Google Cloud Composer(Airflow)上使用Selenium搜寻网页
  10. 数据结构与算法(一)——排序