Android -- Toolbar跟随ListView滑动隐藏和显现
布局
<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">
<ListView
android:id="@+id/main_list_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
<android.support.v7.widget.Toolbar
android:id="@+id/main_bar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@color/std_color_A"
/>
</RelativeLayout>
代码
public class MainActivity extends BaseActivity{
private static final String TAG = MainActivity.class.getSimpleName();
private Toolbar mMainToolbar = null;
private ListView mMainListView = null;
private float mStartY = 0, mLastY = 0, mLastDeltaY;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMainToolbar = (Toolbar)this.findViewById(R.id.main_bar);
this.setSupportActionBar(mMainToolbar);
mMainListView = (ListView)this.findViewById(R.id.main_list_view);
final View header = LayoutInflater.from(this).inflate(R.layout.layout_header, null);//这个header高度要与toolbar相同
mMainListView.addHeaderView(header);
mMainListView.setAdapter(new AudioAdapter(this));
mMainListView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
final float y = event.getY();
float translationY = mMainToolbar.getTranslationY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mStartY = y;
mLastY = mStartY;
break;
case MotionEvent.ACTION_MOVE:
float mDeltaY = y - mLastY;
float newTansY = translationY + mDeltaY;
if (newTansY <= 0 && newTansY >= -mMainToolbar.getHeight()) {
mMainToolbar.setTranslationY(newTansY);
}
mLastY = y;
mLastDeltaY = mDeltaY;
break;
case MotionEvent.ACTION_UP:
ObjectAnimator animator = null;
Log.d(TAG, "mLastDeltaY=" + mLastDeltaY);
if (mLastDeltaY < 0 && mMainListView.getFirstVisiblePosition() > 1) {
Log.v(TAG, "listView.first=" + mMainListView.getFirstVisiblePosition());
animator = ObjectAnimator.ofFloat(mMainToolbar, "translationY", mMainToolbar.getTranslationY(), -mMainToolbar.getHeight());
} else {
animator = ObjectAnimator.ofFloat(mMainToolbar, "translationY", mMainToolbar.getTranslationY(), 0);
}
animator.setDuration(100);
animator.start();
animator.setInterpolator(AnimationUtils.loadInterpolator(MainActivity.this, android.R.interpolator.linear));
break;
}
return false;
}
});
}
}
先用我们自己的Toolbar替换原来的ActionBar,注意,在你的AppTheme中,windowActionbar这一项要设置为false才能用我们自己的去替换原来的,不然运行会报错,然后给Listview一个与Toolbar等高的headerView。然后再设置Touch事件的监听,在onTouch方法的ACTION_MOVE分支中,我们计算出本次触发move事件与上次触发move或者down事件时候,我们的触发点的位置变化量-mDeltaY,然后计算出一个相应的translationY,经过与Toolbar高度比较,判断出新的translationY是否合法,合法,则用setTranslationY方法,给Toolbar赋值。触发UP事件:当触发了UP事件后,就要,我们就要用一个动画,来过度一下。先判断滑动方向,方向向上,则向上滑动,向下,则向下滑动。
我是天王盖地虎的分割线
参考:http://blog.csdn.net/boybeak/article/details/41410113
Android -- Toolbar跟随ListView滑动隐藏和显现的更多相关文章
- 浅谈ListView滑动隐藏显示ToolBar
引言 在App日益追求体验的时代,优秀的用户体验往往会使产品脱颖而出.今天我们就来介绍一种简单的滑动ListView来显示或者隐藏ToolBar的功能. 布局文件 下面我们来看一下这个主界面的布局文件 ...
- Android Developers:使ListView滑动流畅
流畅滑动ListView的关键是保持应用程序的主线程(UI线程)从免于繁重处理.确保你的任何硬盘访问,网络访问或者SQL访问在一个单独的线程中.为了测试你的应用个程序的状态,你能启动StrictMod ...
- Android ScrollView和ListView滑动冲突解决记录
private int mLastX; private int mLastY; public View.OnTouchListener onTouchListener = new View.OnTou ...
- Android仅2步实现 滚粗 汉堡导航栏效果~ 全新底部导航交互(滑动隐藏)
本文同步自wing的地方酒馆 布吉岛大家有木有看这一篇文章,再见,汉堡菜单,我们有了新的 Android 交互设计方案 本库下载地址:https://github.com/githubwing/Bye ...
- ListView的HeaderView包含的GridView滑动隐藏后无法点击问题分析
目录 1 现象 2 问题分析 2.1 滑动前 2.2 滑动后 2.3 mDataChanged赋值为true的位置 2.3 GridView直接作为ListView的HeaderView为什么可以滑动 ...
- Android ListView滑动过程中图片显示重复错乱闪烁问题解决
最新内容建议直接访问原文:Android ListView滑动过程中图片显示重复错乱闪烁问题解决 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及L ...
- Android在ListView滑动数据混乱
我相信做过Android应用程序开发或多或少都遇到了这个问题.或者是在ListView数据损坏幻灯片事件.要么GridView数据损坏幻灯片事件. 让我们来看看一个网友写的文章,个人感觉还不错的文章: ...
- Android Widget 开发详解(二) +支持listView滑动的widget
转载请标明出处:http://blog.csdn.net/sk719887916/article/details/47027263 不少开发项目中都会有widget功能,别小瞧了它,他也是androi ...
- Android 中利用ViewFlipper 滑动屏幕切换页面,ListView展示数据
首先新建一个Android项目,命名为ViewFlipperTest 如图:项目机构,本项目主要操作图中红色箭头标注的文件 1.HgroupAdapter.java文件代码↓主要实现listview数 ...
随机推荐
- 钻牛角尖还是走进死胡同--shell脚本根据名称获得 dubbo 服务的 pid
到了下午,突然觉得坐立不安,可能是因为中午没有休息好.老大不小了还在做页面整合的事情,这是参加工作时就干的工作了.然后突然想去挑战高级一点的缺陷排查,结果一不小心就钻了一个牛角尖.启动 dubbo 服 ...
- .net 中的async,await理解
理解: 1.async修饰的方法可理解为异步方法(必须要配合await,否则和普通方法无异)2.当async方法执行遇到await,则立即将控制权转移到async方法的调用者3.由调用者决定是否需要等 ...
- Go语言中查询SqlServer数据库
一.Go语言中查询MsSQL数据库: // main.go package main import ( "database/sql" "fmt" "l ...
- 一步一步学习ASP.NET 5 (一)-基本概念和环境配置
编者语:时代在变,在csdn开博一年就发了那么的两篇文章.不管是什么原因都认为有愧了.可是今年重心都会在这里发表一些文章,和大家谈谈.NET, 移动跨平台,云计算等热门话题.希望有更好的交流. 好吧言 ...
- 培养iOS开发新人的一个思路
坚持两个方法论: 1.发现问题的方法:(熟悉代码的过程) (1)照着一个完整的工程,从最基本的页面开始做起.不懂的地方就问,就查. (2)在阅读代码或拿到需求后要学会对问题进行分解.一个陌生的问题如果 ...
- python测试开发django-41.crispy-forms设计标签式导航菜单(TabHolder)
前言 xadmin的详情页面主要是用form_layout布局,学会了完全可以不用写html代码,也能做出很好看的页面. xadmin的html页面是用的Bootstrap3框架设计的,layout布 ...
- 关于spring session redis共享session的跨子域的处理
安装完redis, spring端只要下面这两个bean配置上就可以用了 <?xml version="1.0" encoding="UTF-8"?> ...
- sql --- where concat
// where cancat 函数 SELECT * from users WHERE email != CONCAT(username, '', '@huan1234qiu.com');
- C#泛型委托Predicate、Action、Func
Predicate Predicate泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法.此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素.通过查看源码发现 Pr ...
- 对于多个button要在同一个监听器中实现自己的单击事件的方法小诀窍。
在网上的一些教程中往往是把一个button加入多个监听器,却非常少有人会把多个button在同一个监听器中去实现他们的单击事件,并且这杨的事实上是非常有用的,比方说在制作一个简单的计算器是就须要0-9 ...