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();
}

//위에는 위치 이동과 투명도 속성 애니메이션 있습니다 

사용할 때 theme을 NoActionBar로 사용해야 합니다. 그렇지 않으면 충돌이 발생할 수 있습니다. 동시에 컴파일

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

2toolbar가 아니라 숨기고 보이는 요소가 우리가 정의한 레이아웃 myView이면, 몇 가지 주의할 점이 있습니다.
(1) 레이아웃은 상대 레이아웃을 사용하여, 우리가 정의한 레이아웃이 listView 위에 float합니다.
(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(이메일을 보내면, #을 @으로 변경해 주세요. 신고를 하고, 관련 증거를 제공해 주세요. 확인되면, 이 사이트는 즉시 의심스러운 저작권 내용을 삭제합니다。)

좋아하는 것