引言

在App日益追求体验的时代,优秀的用户体验往往会使产品脱颖而出。今天我们就来介绍一种简单的滑动ListView来显示或者隐藏ToolBar的功能。

布局文件

下面我们来看一下这个主界面的布局文件。在这个布局文件中,主要是一个ListView控件和一个ToolBar控件。布局如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent">
  6.  
  7. <ListView
  8. android:layout_width="match_parent"
  9. android:layout_height="match_parent"
  10. android:background="#f2f2f2"
  11. android:divider="#abcdee"
  12. android:dividerHeight="1px"
  13. android:id="@+id/listView">
  14.  
  15. </ListView>
  16.  
  17. <!--ToolBar-->
  18. <android.support.v7.widget.Toolbar
  19. android:layout_width="match_parent"
  20. android:layout_height="wrap_content"
  21. android:background="#4097e6"
  22. android:id="@+id/toolBar">
  23.  
  24. </android.support.v7.widget.Toolbar>
  25.  
  26. </RelativeLayout>

主界面代码

  实现思路:

  让一个布局显示或者隐藏并且带有动画效果,我们可以通过属性动画来实现。实现这个效果的关键就是监听ListView的各种滑动事件,我们肯定需要借助View的OnTouchListener接口来监听各种状态。注意点:

由于增加了一个ToolBar,我们需要为ListView添加一个HeadView,防止ToolBar挡住ListView的第一个Item。

  下面看代码实现:

  1. package com.research.gong.android_view_research;
  2.  
  3. import android.animation.ObjectAnimator;
  4. import android.app.Activity;
  5. import android.os.Bundle;
  6. import android.support.v7.widget.Toolbar;
  7. import android.view.MotionEvent;
  8. import android.view.View;
  9. import android.view.ViewConfiguration;
  10. import android.widget.AbsListView;
  11. import android.widget.ArrayAdapter;
  12. import android.widget.ListView;
  13.  
  14. public class MainActivity extends Activity {
  15.  
  16. private ListView listView;
  17. String[] datas = {"A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "A10",
  18. "A11", "A12", "A13", "A14", "A15", "A16", "A17", "A18", "A19", "A20"};
  19. private float scaledTouchSlop;
  20. private float firstY = 0;
  21. private Toolbar toolbar;
  22. private ObjectAnimator animtor;
  23.  
  24. @Override
  25. protected void onCreate(Bundle savedInstanceState) {
  26. super.onCreate(savedInstanceState);
  27. setContentView(R.layout.activity_main);
  28. toolbar = (Toolbar) findViewById(R.id.toolBar);
  29. listView = (ListView) findViewById(R.id.listView);
  30. /**
  31. * 添加一个HeadView避免第一个Item被ToolBar遮挡
  32. * 必须在setAdapter之前进行设置
  33. */
  34. initHeadView();
  35. listView.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, datas));
  36. //判断认为是滑动的最小距离(乘以系数调整滑动灵敏度)
  37. scaledTouchSlop = ViewConfiguration.get(this).getScaledTouchSlop()*3.0f;
  38. /**
  39. * 设置触摸事件
  40. */
  41. listView.setOnTouchListener(new View.OnTouchListener() {
  42. private float currentY;
  43. private int direction=-1;
  44. private boolean mShow = true;
  45.  
  46. @Override
  47. public boolean onTouch(View v, MotionEvent event) {
  48. switch (event.getAction()) {
  49. case MotionEvent.ACTION_DOWN:
  50. firstY = event.getY();
  51. break;
  52. case MotionEvent.ACTION_MOVE:
  53. currentY = event.getY();
  54. //向下滑动
  55. if (currentY - firstY > scaledTouchSlop) {
  56. direction = 0;
  57. }
  58. //向上滑动
  59. else if (firstY - currentY > scaledTouchSlop) {
  60. direction = 1;
  61. }
  62. //如果是向上滑动,并且ToolBar是显示的,就隐藏ToolBar
  63. if (direction == 1) {
  64. if (mShow) {
  65. toobarAnim(1);
  66. mShow = !mShow;
  67. }
  68. } else if (direction == 0) {
  69. if (!mShow) {
  70. toobarAnim(0);
  71. mShow = !mShow;
  72. }
  73. }
  74. break;
  75. case MotionEvent.ACTION_UP:
  76. break;
  77. }
  78. return false;//注意此处不能返回true,因为如果返回true,onTouchEvent就无法执行,导致的后果是ListView无法滑动
  79. }
  80. });
  81. }
  82.  
  83. /**
  84. * 设置头布局,注意:这个头布局的高度要和ToolBar的高度一致
  85. */
  86. public void initHeadView() {
  87. View view = new View(this);
  88. //abc_action_bar_default_height_material获取系统ActionBar的高度
  89. AbsListView.LayoutParams params = new AbsListView.LayoutParams
  90. (AbsListView.LayoutParams.MATCH_PARENT,
  91. (int) getResources().getDimension(R.dimen.abc_action_bar_default_height_material));
  92. view.setLayoutParams(params);
  93. listView.addHeaderView(view);
  94. }
  95.  
  96. /**
  97. * ToolBar显示隐藏动画
  98. * @param direction
  99. */
  100. public void toobarAnim(int direction) {
  101. //开始新的动画之前要先取消以前的动画
  102. if (animtor != null && animtor.isRunning()) {
  103. animtor.cancel();
  104. }
  105. //toolbar.getTranslationY()获取的是Toolbar距离自己顶部的距离
  106. float translationY=toolbar.getTranslationY();
  107. if (direction == 0) {
  108. animtor = ObjectAnimator.ofFloat(toolbar, "translationY", translationY, 0);
  109. } else if (direction == 1) {
  110. animtor = ObjectAnimator.ofFloat(toolbar, "translationY", translationY, -toolbar.getHeight());
  111. }
  112. animtor.start();
  113. }
  114. }

  相信代码中注释已经解释的很详细了。唯一需要注意的是:scaledTouchSlop值默认获取的是Android系统能识别的最小滑动距离。我们通过乘以相关系数,可以适当的调整滑动的灵敏度。

浅谈ListView滑动隐藏显示ToolBar的更多相关文章

  1. 安卓开发_浅谈ListView(SimpleAdapter数组适配器)

    安卓开发_浅谈ListView(ArrayAdapter数组适配器) 学习使用ListView组件和SimapleAdapter适配器实现一个带图标的ListView列表 总共3部分 一.MainAc ...

  2. 安卓开发_浅谈ListView(自定义适配器)

    ListView作为一个实际开发中使用率非常高的视图,一般的系统自带的适配器都无法满足开发中的需求,这时候就需要开发人员来自定义适配器使得ListView能够有一个不错的显示效果 有这样一个Demo ...

  3. Android项目实战(二十):浅谈ListView悬浮头部展现效果

    先看下效果:需求是 滑动列表 ,其中一部分视图(粉丝数,关注数这一部分)在滑动到顶端的时候不消失,而是停留在整个界面头部. 我们先分析要解决的问题: 1.如何实现列表ListView顶部视图跟随Lis ...

  4. Android -- Toolbar跟随ListView滑动隐藏和显现

    布局 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:too ...

  5. 安卓开发_浅谈ListView之分页列表

    前言: 在开发的过程中,有时候我们需要从网络解析一些数据,比如最近的一些新闻,我们需要把这些数据用ListView显示出来. 因为是解析一个网络数据源,这样将会一下子将所有的数据解析出来,当数据源数据 ...

  6. 安卓开发_浅谈ListView(ArrayAdapter数组适配器)

    列表视图(ListView)以垂直的形式列出需要显示的列表项. 实现过程:新建适配器->添加数据源到适配器->视图加载适配器 在安卓中,有两种方法可以在屏幕中添加列表视图 1.直接用Lis ...

  7. 浅谈RecyclerView(完美替代ListView,GridView)

    Android RecyclerView 是Android5.0推出来的,导入support-v7包即可使用. 个人体验来说,RecyclerView绝对是一款功能强大的控件. 首先总结下Recycl ...

  8. ListView的HeaderView包含的GridView滑动隐藏后无法点击问题分析

    目录 1 现象 2 问题分析 2.1 滑动前 2.2 滑动后 2.3 mDataChanged赋值为true的位置 2.3 GridView直接作为ListView的HeaderView为什么可以滑动 ...

  9. 原生JS实现全屏切换以及导航栏滑动隐藏及显示——重构前

    思路分析: 向后滚动鼠标滚轮,页面向下全屏切换:向前滚动滚轮,页面向上全屏切换.切换过程为动画效果. 第一屏时,导航栏固定在页面顶部,切换到第二屏时,导航条向左滑动隐藏.切换回第一屏时,导航栏向右滑动 ...

随机推荐

  1. 使用Hudson进行持续集成

    小Alan最近接了一个任务,就是使用Hudson进行持续集成,持续集成是怎么个概念,3言2语也说不清,有兴趣的童鞋去找我二奶度娘问问就知道了,说到Hudson就不得不提一下jenkins,目前来说用j ...

  2. [MySQL Reference Manual] 23 Performance Schema结构

    23 MySQL Performance Schema 23 MySQL Performance Schema 23.1 性能框架快速启动 23.2 性能框架配置 23.2.1 性能框架编译时配置 2 ...

  3. MongoDB学习笔记一—简介

    MongoDB简介 MongoDB在功能和复杂性之间取得了很好的平衡,并且大大简化了原先十分复杂的任务,它具备支撑今天主流web应用的关键功能:索引.复制.分片.丰富的查询语法,特别灵活的数据模型.与 ...

  4. yii2 增删改查

    自己总结的yii2 advanced 版本的简单的增删改查,希望对大家有所帮助 1.gii生成的actionCreate()方法中 获取插入语句的id $id = $model->attribu ...

  5. problems during rovio build

    1. rovio的readme中使用的是catkin build, ROS tutorial中用的是catkin_make. 关于build与make的区别: build重新编译所有文件:make默认 ...

  6. codegate-quals-2013-vuln100

    最近想多看看题目积累些经验, -------- 程序分析 64位,保护措施都没开 gdb-peda$ checksec CANARY : disabled FORTIFY : disabled NX ...

  7. 6-3 bash脚本编程之五 字符串测试及for循环

    1. 字符测试 ==:等号两边要有空格,否则会被认为是赋值. !=:  测试是否相等,记住如果不等为真,等为假. -n string: 测试指定字符串是否为空,空位真,不空为假. -s string: ...

  8. PB gird类型数据窗口 设置分组、分组小计、合计

    今天遇到一个需求,gird表格数据如下:  部门  类型 数据   A  类型1  1  A  类型2  2  B  类型1  3  B  类型2  4   合计 10 实际需要显示的结果为:  部门 ...

  9. 基于corosync+pacemaker+drbd+LNMP做web服务器的高可用集群

    实验系统:CentOS 6.6_x86_64 实验前提: 1)提前准备好编译环境,防火墙和selinux都关闭: 2)本配置共有两个测试节点,分别coro1和coro2,对应的IP地址分别为192.1 ...

  10. 消息服务MNS和消息队列ONS产品对比

    消息服务MNS和消息队列ONS产品对比 MNS已经进过严格测试,已达到商业化的稳定性要求,其主要特点和适用场景 1.数据高可靠(10个9),对于数据可靠性敏感(要求消息数据不丢)的应用场景建议选择. ...