Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 神奇的listView實現自動顯示隱藏布局Android代碼

神奇的listView實現自動顯示隱藏布局Android代碼

編輯:關於Android編程

借助View的OnTouchListener接口來監聽listView的滑動,通過比較與上次坐標的大小,判斷滑動方向,並通過滑動方向來判斷是否需顯示或者隱藏對應的布局,並且帶有動畫效果。

1.自動顯示隱藏Toolbar

首先給listView增加一個HeaderView,避免第一個Item被Toolbar遮擋。 

View header=new View(this);
 header.setLayoutParams(new AbsListView.LayoutParams(
  AbsListView.LayoutParams.MATCH_PARENT,
  (int)getResources().getDimension(R.dimen.abc_action_bar_default_height_material)));
 mListView.addHeaderView(header);

//R.dimen.abc_action_bar_default_height_material為系統ActionBar的高度

定義一個mTouchSlop變量,獲取系統認為的最低滑動距離
復制代碼 代碼如下:mTouchSlop=ViewConfiguration.get(this).getScaledTouchSlop();//系統認為的最低滑動距離      

判斷滑動事件

bbsListView.setOnTouchListener(new OnTouchListener() {
   
   @Override
   public boolean onTouch(View v, MotionEvent event) {
     switch (event.getAction()) 
    {
    case MotionEvent.ACTION_DOWN:
     mFirstY=event.getY();
     break;
    case MotionEvent.ACTION_MOVE:
     mCurrentY=event.getY();
     if(mCurrentY-mFirstY>mTouchSlop)
      direction=0; //listView向下滑動
     else if(mFirstY-mCurrentY>mTouchSlop)
      direction=1; //listView向上滑動
     if(direction==1)
     {
      if(mShow)
      {
       toolbarAnim(1); //隱藏上方的view
       mShow=!mShow;
      }
     }
     else if(direction==0)
     {
      if(!mShow)
      {
       toolbarAnim(0); //展示上方的view
       mShow=!mShow;
      }
     }
    case MotionEvent.ACTION_UP:
     break;
    }
    return false;
   }
  });
 }

屬性動畫 

protected void toolbarAnim(int flag) 
 {
  
  
  if(set!=null && set.isRunning())
  {
   set.cancel();
  }
  if(flag==0)
  {
  

   mAnimator1=ObjectAnimator.ofFloat(mToolbar, 
     "translationY", linearView.getTranslationY(),0);
   mAnimator2=ObjectAnimator.ofFloat(mToolbar, "alpha", 0f,1f);
  }
  else if(flag==1)
  {
   
  
   mAnimator1=ObjectAnimator.ofFloat(mToolbar, 
     "translationY", linearView.getTranslationY(),-linearView.getHeight());
   mAnimator2=ObjectAnimator.ofFloat(mToolbar, "alpha", 1f,0f);
   
  }
  set=new AnimatorSet();
  set.playTogether(mAnimator1,mAnimator2);
  set.start();
  
}

//上面為位移還有透明度屬性動畫 

使用的時候theme要用NoActionBar的,不然會引起沖突。同時引入編譯

dependencies{
   compile fileTree(include:['*.jar'],dir:'libs')
   compile 'com.android.support:appcompat-v7:21.0.3'
 } 

2.當要隱藏和顯示的組件不是toolbar,而是我們自定義的布局myView時,需要注意一些點,
(1) 布局要用相對布局,讓我們自定義的布局懸浮在listView上方。
(2)避免第一個Item被myView遮擋,給listView增加一個HeaderView,此時需要測量myView的高度,要用下面這種方法,把任務post到UI線程中,不然執行會出錯。 

final View header=new View(this); //給listView增加一個headView,避免第一個item被遮擋 header.post(new Runnable() {
 public void run() {
     header.setLayoutParams(new AbsListView.LayoutParams(            AbsListView.LayoutParams.MATCH_PARENT, myView.getHeight()));
   }
  });

其他的與toolbar一樣

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved