Android:菜单栏Menubar跟随ListView滑动隐藏和显示

来源:互联网 发布:mac苹果电脑使用教程 编辑:程序博客网 时间:2024/05/16 06:21

使用过Google Play Store应用或者Google+应用的人都知道,其ActionBar能随着ListView的滑动而相应的隐藏或者显示。效果看起来很不错,为此,我笨拙的模仿了一个类似的效果,不知道有没有更好的办法。

先上主布局activity_main:

[html] view plaincopy
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     tools:context="com.beak.music.ui.MainActivity">  
  6.     <ListView  
  7.         android:id="@+id/main_list_view"  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="fill_parent"  
  10.         />  
  11.     <android.support.v7.widget.Toolbar  
  12.         android:id="@+id/main_bar"  
  13.         android:layout_width="fill_parent"  
  14.         android:layout_height="wrap_content"  
  15.         android:background="@color/std_color_A"  
  16.         />  
  17. </RelativeLayout>  
注意这里的Toolbar,我们将会用这个Toolbar来替换原来的的actionBar。

现在是MainActivity.java里的代码:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class MainActivity extends BaseActivity{  
  2.   
  3.     private static final String TAG = MainActivity.class.getSimpleName();  
  4.   
  5.     private Toolbar mMainToolbar = null;  
  6.     private ListView mMainListView = null;  
  7.   
  8.     private float mStartY = 0, mLastY = 0, mLastDeltaY;  
  9.   
  10.     @Override  
  11.     protected void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.activity_main);  
  14.   
  15.         mMainToolbar = (Toolbar)this.findViewById(R.id.main_bar);  
  16.         this.setSupportActionBar(mMainToolbar);  
  17.   
  18.         mMainListView = (ListView)this.findViewById(R.id.main_list_view);  
  19.         final View header = LayoutInflater.from(this).inflate(R.layout.layout_header, null);  
  20.         mMainListView.addHeaderView(header);  
  21.         mMainListView.setAdapter(new AudioAdapter(this));  
  22.   
  23.   
  24.         mMainListView.setOnTouchListener(new View.OnTouchListener() {  
  25.             @Override  
  26.             public boolean onTouch(View v, MotionEvent event) {  
  27.                 final float y = event.getY();  
  28.                 float translationY = mMainToolbar.getTranslationY();  
  29.                 switch (event.getAction()) {  
  30.                     case MotionEvent.ACTION_DOWN:  
  31. //                        Log.v(TAG, "Down");  
  32.                         mStartY = y;  
  33.                         mLastY = mStartY;  
  34.                         break;  
  35.                     case MotionEvent.ACTION_MOVE:  
  36.                         float mDeltaY = y - mLastY;  
  37.   
  38.                         float newTansY = translationY + mDeltaY;  
  39.                         if (newTansY <= 0 && newTansY >= -mMainToolbar.getHeight()) {  
  40.                             mMainToolbar.setTranslationY(newTansY);  
  41.                         }  
  42.                         mLastY = y;  
  43.                         mLastDeltaY = mDeltaY;  
  44. //                        Log.v(TAG, "Move");  
  45.                         break;  
  46.                     case MotionEvent.ACTION_UP:  
  47.                         ObjectAnimator animator = null;  
  48.                         Log.d(TAG, "mLastDeltaY=" + mLastDeltaY);  
  49.                         if (mLastDeltaY < 0 && mMainListView.getFirstVisiblePosition() > 1) {  
  50.                             Log.v(TAG, "listView.first=" + mMainListView.getFirstVisiblePosition());  
  51.                             animator = ObjectAnimator.ofFloat(mMainToolbar, "translationY", mMainToolbar.getTranslationY(), -mMainToolbar.getHeight());  
  52.                         } else {  
  53.                             animator = ObjectAnimator.ofFloat(mMainToolbar, "translationY", mMainToolbar.getTranslationY(), 0);  
  54.                         }  
  55.                         animator.setDuration(100);  
  56.                         animator.start();  
  57.                         animator.setInterpolator(AnimationUtils.loadInterpolator(MainActivity.this, android.R.interpolator.linear));  
  58. //                        Log.v(TAG, "Up");  
  59.                         break;  
  60.                 }  
  61.                 return false;  
  62.             }  
  63.         });  
  64.     }  
  65. }  
主要的问题是ListView滑动手势检测和Toolbar里的动画。

一开始,先用我们自己的Toolbar替换原来的ActionBar,注意,在你的AppTheme中,windowActionbar这一项要设置为false才能用我们自己的去替换原来的,不然运行会报错,然后给Listview一个与Toolbar等高的headerView。然后再设置Touch事件的监听,

在onTouch方法的ACTION_MOVE分支中,我们计算出本次触发move事件与上次触发move或者down事件时候,我们的触发点的位置变化量-mDeltaY,然后计算出一个相应的translationY,经过与Toolbar高度比较,判断出新的translationY是否合法,合法,则用setTranslationY方法,给Toolbar赋值。

触发UP事件:

当触发了UP事件后,就要,我们就要用一个动画,来过度一下。先判断滑动方向,方向向上,则向上滑动,向下,则向下滑动。

android studio project code 代码在这里,不过是Android studio代码,没有写ADT代码


转载:http://blog.csdn.net/boybeak/article/details/41410113

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 魅蓝3s卡顿怎么办视频 魅蓝3s手机太卡怎么办 红米4x外放破音怎么办 魅族手机刷机后内存变小了怎么办 手机用久了内存越来越小怎么办魅族 贴了车膜左右后视镜反光怎么办 贴手机膜时酒精没了怎么办 魅蓝e外屏幕碎了怎么办 贴的手机膜边缘翘起来着怎么办 手机后面贴的膜都是胶怎么办 车漆外面一层保护膜被划开了怎么办 美团骑手gps信号弱时怎么办 华为荣耀4x充电插口坏了怎么办 华为畅享5s开不了机怎么办 华为梅特10忘记账号密码怎么办 华为荣耀8充电接口坏了怎么办 华为手机锁屏了自动开屏怎么办 支付宝收货地址写错了怎么办 支付宝领海报地址写错了怎么办 手机总是弹出日历已停止运行怎么办 华为mate8忘了锁屏密码怎么办 红米4a打王者卡怎么办 苹果5s软件更新密码忘记了怎么办 华为荣耀P9进水了没有声音怎么办 华为荣耀7原相机不能拍照怎么办 华为手机触屏密码忘记了怎么办 华为荣耀10屏锁密码忘了怎么办 华为手机开机卡在开机界面怎么办 苹果6s国行不能用移动4g怎么办 苹果手机32g内存不够用怎么办 华为荣耀6x忘记了密码怎么办 百度粉色衣服被洗变色了怎么办 粉色衣服放进洗衣机洗变色了怎么办 红米note5a应用锁忘了怎么办 索尼手机死机了怎么办不可拆卸电池 华为手机一直停留在开机画面怎么办 5s用11.4太卡了怎么办 华为荣耀5a手机声音小怎么办 牙签卡在手机插卡针里怎么办 捡的华为手机账号激活不了怎么办 华为平板激活手机密码忘了怎么办