English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

素晴らしい listView で自動的にレイアウトを表示/非表示する Android コード

ViewのOnTouchListenerインターフェースを使用してlistViewのスライドを監視し、前回の座標と比較してスライド方向を判断し、スライド方向に応じて対応するレイアウトを表示または非表示にし、アニメーション効果も含む

1.自動的にToolbarを表示/非表示

まずlistViewにHeaderViewを追加し、最初のアイテムが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();
}

//上記は位移と透明度の属性アニメーションです。 

使用する際には、NoActionBarのthemeを使用する必要があります。それで競合が発生し、コンパイルが引き起こされます。

依存関係{
   ファイルツリーをコンパイルする際には、include配列に[''を含める。*.jar',dir:'libs'
   compile 'com.android.support:appcompat-v7:21.0.3'
 } 

2当てはめたいコンポーネントがtoolbarではなく、カスタムレイアウトのmyViewの場合、いくつかのポイントに注意する必要があります。
(1) レイアウトは相対レイアウトを使用し、カスタムレイアウトがlistViewの上に浮かぶようにします。
(2)最初のItemがmyViewに隠れないように、listViewにHeaderViewを追加します。この時、myViewの高さを測定する必要があります。以下のような方法でタスクを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と同じです

これでこの記事は全てです。皆様の学習に役立てば幸いですし、呐喊教程を多くの皆様にサポートしていただけると嬉しいです。

声明:この記事の内容はインターネットから取得しており、著作権者に帰属します。インターネットユーザーにより自発的に提供された内容であり、このサイトは所有権を持ちません。人工的な編集は行われていません。また、関連する法的責任を負いません。著作権侵害を疑う内容がある場合は、メール:notice#wまでお知らせください。3codebox.com(メールを送信する際、#を@に変更してください。告発を行い、関連する証拠を提供してください。一旦確認が取れれば、このサイトは即座に侵害疑いのコンテンツを削除します。)

おすすめ