浅谈ListView滑动隐藏显示ToolBar
引言
在App日益追求体验的时代,优秀的用户体验往往会使产品脱颖而出。今天我们就来介绍一种简单的滑动ListView来显示或者隐藏ToolBar的功能。
布局文件
下面我们来看一下这个主界面的布局文件。在这个布局文件中,主要是一个ListView控件和一个ToolBar控件。布局如下:
- <?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">
- <ListView
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="#f2f2f2"
- android:divider="#abcdee"
- android:dividerHeight="1px"
- android:id="@+id/listView">
- </ListView>
- <!--ToolBar-->
- <android.support.v7.widget.Toolbar
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="#4097e6"
- android:id="@+id/toolBar">
- </android.support.v7.widget.Toolbar>
- </RelativeLayout>
主界面代码
实现思路:
让一个布局显示或者隐藏并且带有动画效果,我们可以通过属性动画来实现。实现这个效果的关键就是监听ListView的各种滑动事件,我们肯定需要借助View的OnTouchListener接口来监听各种状态。注意点:
由于增加了一个ToolBar,我们需要为ListView添加一个HeadView,防止ToolBar挡住ListView的第一个Item。
下面看代码实现:
- package com.research.gong.android_view_research;
- import android.animation.ObjectAnimator;
- import android.app.Activity;
- import android.os.Bundle;
- import android.support.v7.widget.Toolbar;
- import android.view.MotionEvent;
- import android.view.View;
- import android.view.ViewConfiguration;
- import android.widget.AbsListView;
- import android.widget.ArrayAdapter;
- import android.widget.ListView;
- public class MainActivity extends Activity {
- private ListView listView;
- String[] datas = {"A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "A10",
- "A11", "A12", "A13", "A14", "A15", "A16", "A17", "A18", "A19", "A20"};
- private float scaledTouchSlop;
- private float firstY = 0;
- private Toolbar toolbar;
- private ObjectAnimator animtor;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- toolbar = (Toolbar) findViewById(R.id.toolBar);
- listView = (ListView) findViewById(R.id.listView);
- /**
- * 添加一个HeadView避免第一个Item被ToolBar遮挡
- * 必须在setAdapter之前进行设置
- */
- initHeadView();
- listView.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, datas));
- //判断认为是滑动的最小距离(乘以系数调整滑动灵敏度)
- scaledTouchSlop = ViewConfiguration.get(this).getScaledTouchSlop()*3.0f;
- /**
- * 设置触摸事件
- */
- listView.setOnTouchListener(new View.OnTouchListener() {
- private float currentY;
- private int direction=-1;
- private boolean mShow = true;
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- firstY = event.getY();
- break;
- case MotionEvent.ACTION_MOVE:
- currentY = event.getY();
- //向下滑动
- if (currentY - firstY > scaledTouchSlop) {
- direction = 0;
- }
- //向上滑动
- else if (firstY - currentY > scaledTouchSlop) {
- direction = 1;
- }
- //如果是向上滑动,并且ToolBar是显示的,就隐藏ToolBar
- if (direction == 1) {
- if (mShow) {
- toobarAnim(1);
- mShow = !mShow;
- }
- } else if (direction == 0) {
- if (!mShow) {
- toobarAnim(0);
- mShow = !mShow;
- }
- }
- break;
- case MotionEvent.ACTION_UP:
- break;
- }
- return false;//注意此处不能返回true,因为如果返回true,onTouchEvent就无法执行,导致的后果是ListView无法滑动
- }
- });
- }
- /**
- * 设置头布局,注意:这个头布局的高度要和ToolBar的高度一致
- */
- public void initHeadView() {
- View view = new View(this);
- //abc_action_bar_default_height_material获取系统ActionBar的高度
- AbsListView.LayoutParams params = new AbsListView.LayoutParams
- (AbsListView.LayoutParams.MATCH_PARENT,
- (int) getResources().getDimension(R.dimen.abc_action_bar_default_height_material));
- view.setLayoutParams(params);
- listView.addHeaderView(view);
- }
- /**
- * ToolBar显示隐藏动画
- * @param direction
- */
- public void toobarAnim(int direction) {
- //开始新的动画之前要先取消以前的动画
- if (animtor != null && animtor.isRunning()) {
- animtor.cancel();
- }
- //toolbar.getTranslationY()获取的是Toolbar距离自己顶部的距离
- float translationY=toolbar.getTranslationY();
- if (direction == 0) {
- animtor = ObjectAnimator.ofFloat(toolbar, "translationY", translationY, 0);
- } else if (direction == 1) {
- animtor = ObjectAnimator.ofFloat(toolbar, "translationY", translationY, -toolbar.getHeight());
- }
- animtor.start();
- }
- }
相信代码中注释已经解释的很详细了。唯一需要注意的是:scaledTouchSlop值默认获取的是Android系统能识别的最小滑动距离。我们通过乘以相关系数,可以适当的调整滑动的灵敏度。
浅谈ListView滑动隐藏显示ToolBar的更多相关文章
- 安卓开发_浅谈ListView(SimpleAdapter数组适配器)
安卓开发_浅谈ListView(ArrayAdapter数组适配器) 学习使用ListView组件和SimapleAdapter适配器实现一个带图标的ListView列表 总共3部分 一.MainAc ...
- 安卓开发_浅谈ListView(自定义适配器)
ListView作为一个实际开发中使用率非常高的视图,一般的系统自带的适配器都无法满足开发中的需求,这时候就需要开发人员来自定义适配器使得ListView能够有一个不错的显示效果 有这样一个Demo ...
- Android项目实战(二十):浅谈ListView悬浮头部展现效果
先看下效果:需求是 滑动列表 ,其中一部分视图(粉丝数,关注数这一部分)在滑动到顶端的时候不消失,而是停留在整个界面头部. 我们先分析要解决的问题: 1.如何实现列表ListView顶部视图跟随Lis ...
- Android -- Toolbar跟随ListView滑动隐藏和显现
布局 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:too ...
- 安卓开发_浅谈ListView之分页列表
前言: 在开发的过程中,有时候我们需要从网络解析一些数据,比如最近的一些新闻,我们需要把这些数据用ListView显示出来. 因为是解析一个网络数据源,这样将会一下子将所有的数据解析出来,当数据源数据 ...
- 安卓开发_浅谈ListView(ArrayAdapter数组适配器)
列表视图(ListView)以垂直的形式列出需要显示的列表项. 实现过程:新建适配器->添加数据源到适配器->视图加载适配器 在安卓中,有两种方法可以在屏幕中添加列表视图 1.直接用Lis ...
- 浅谈RecyclerView(完美替代ListView,GridView)
Android RecyclerView 是Android5.0推出来的,导入support-v7包即可使用. 个人体验来说,RecyclerView绝对是一款功能强大的控件. 首先总结下Recycl ...
- ListView的HeaderView包含的GridView滑动隐藏后无法点击问题分析
目录 1 现象 2 问题分析 2.1 滑动前 2.2 滑动后 2.3 mDataChanged赋值为true的位置 2.3 GridView直接作为ListView的HeaderView为什么可以滑动 ...
- 原生JS实现全屏切换以及导航栏滑动隐藏及显示——重构前
思路分析: 向后滚动鼠标滚轮,页面向下全屏切换:向前滚动滚轮,页面向上全屏切换.切换过程为动画效果. 第一屏时,导航栏固定在页面顶部,切换到第二屏时,导航条向左滑动隐藏.切换回第一屏时,导航栏向右滑动 ...
随机推荐
- 使用Hudson进行持续集成
小Alan最近接了一个任务,就是使用Hudson进行持续集成,持续集成是怎么个概念,3言2语也说不清,有兴趣的童鞋去找我二奶度娘问问就知道了,说到Hudson就不得不提一下jenkins,目前来说用j ...
- [MySQL Reference Manual] 23 Performance Schema结构
23 MySQL Performance Schema 23 MySQL Performance Schema 23.1 性能框架快速启动 23.2 性能框架配置 23.2.1 性能框架编译时配置 2 ...
- MongoDB学习笔记一—简介
MongoDB简介 MongoDB在功能和复杂性之间取得了很好的平衡,并且大大简化了原先十分复杂的任务,它具备支撑今天主流web应用的关键功能:索引.复制.分片.丰富的查询语法,特别灵活的数据模型.与 ...
- yii2 增删改查
自己总结的yii2 advanced 版本的简单的增删改查,希望对大家有所帮助 1.gii生成的actionCreate()方法中 获取插入语句的id $id = $model->attribu ...
- problems during rovio build
1. rovio的readme中使用的是catkin build, ROS tutorial中用的是catkin_make. 关于build与make的区别: build重新编译所有文件:make默认 ...
- codegate-quals-2013-vuln100
最近想多看看题目积累些经验, -------- 程序分析 64位,保护措施都没开 gdb-peda$ checksec CANARY : disabled FORTIFY : disabled NX ...
- 6-3 bash脚本编程之五 字符串测试及for循环
1. 字符测试 ==:等号两边要有空格,否则会被认为是赋值. !=: 测试是否相等,记住如果不等为真,等为假. -n string: 测试指定字符串是否为空,空位真,不空为假. -s string: ...
- PB gird类型数据窗口 设置分组、分组小计、合计
今天遇到一个需求,gird表格数据如下: 部门 类型 数据 A 类型1 1 A 类型2 2 B 类型1 3 B 类型2 4 合计 10 实际需要显示的结果为: 部门 ...
- 基于corosync+pacemaker+drbd+LNMP做web服务器的高可用集群
实验系统:CentOS 6.6_x86_64 实验前提: 1)提前准备好编译环境,防火墙和selinux都关闭: 2)本配置共有两个测试节点,分别coro1和coro2,对应的IP地址分别为192.1 ...
- 消息服务MNS和消息队列ONS产品对比
消息服务MNS和消息队列ONS产品对比 MNS已经进过严格测试,已达到商业化的稳定性要求,其主要特点和适用场景 1.数据高可靠(10个9),对于数据可靠性敏感(要求消息数据不丢)的应用场景建议选择. ...