6

나는 최근 안드로이드의 상태 표시 줄과 비슷한 레이아웃을 만들고 있습니다.스크롤하여 축소 툴바없이보기

enter image description here

나는 용기 내부에 두 개의 Views 있습니다. ViewPagerRecyclerView. 기본 동작은 RecyclerView을 스크롤 할 때 ViewPager의 크기를 줄이고 그 반대의 경우도 마찬가지입니다.

enter image description here

논리 :

viewPagerMaxHeight = 200; 
if scrollTop 
    is ViewPager.height > viewPagerMaxHeight? 
    YES: Prevent Scroll and Decrease ViewPager size apropriatry 
    No: Scroll RecyclerView 
if scrollBottom 
    did we scroll to position 0? 
    YES: Start increasing ViewPager size 
    No: Scroll RecyclerView 

몇 가지 참고 사항 : - RecyclerView 다양한 크기의 항목이 포함되어 있습니다. - 때로는 항목이 제거되고 추가됩니다. - 간단한 RecyclerView이지 서로 붕괴되는 알림에있는 이 아닙니다.

나는 논리의 대부분을 스스로 만들 수 있지만 RecyclerView에 적합한 청취자를 만들 수 없어 방향과 양이 스크롤됩니다. 스크롤에서 RecyclerView을 방지 보너스에게 있습니다

편집 :

나는 내가 그래서 첫 번째 항목으로 NestedScrollViewRecycleView 패딩을 설정하고 스크롤하고있어 github

v.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() { 
    @Override 
    public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { 
     Log.e("scrollY", ""+scrollY); 
     Log.e("oldScrollY", ""+oldScrollY); 
     Log.e("currentHeight", ""+currentHeight); 
     if(scrollY == 200) { 
      Log.e("==200", "JU"); 
     } else if (scrollY < 200) { 
      Log.e("<200", ""+currentHeight); 

      if(currentHeight < fullHeight) { 
       Log.e("current<full", Integer.toString(deltaScroll)); 
       deltaScroll = oldScrollY - scrollY; 
       currentHeight = currentHeight + deltaScroll; 
       if(currentHeight > fullHeight) { 
        currentHeight = fullHeight; 
       } 
       ku.getLayoutParams().height = currentHeight; 
       ku.requestLayout(); 
      } 
      v.scrollTo(0, 200); 
     } else if (scrollY > oldScrollY) { 
      Log.e("Scroll DOWN", "" + Integer.toString(scrollY)); 
      deltaScroll = scrollY - oldScrollY; 
      currentHeight = currentHeight - deltaScroll; 
      if(currentHeight > minHeight) { 
       ku.getLayoutParams().height = currentHeight; 
       ku.requestLayout(); 
       v.scrollTo(0, 200); 

      } else { 
       currentHeight = minHeight; 
       ku.getLayoutParams().height = minHeight; 
       ku.requestLayout(); 
      } 

     } 
    } 
}); 

에 예를 만들었습니다 패딩이 표시되지 않습니다. 이렇게하면 이미 TOP에있을 때에도 TOP를 스크롤 할 수 있습니다.

모든 것이 효과가있는 것처럼 보이지만 천천히 스크롤 할 때 스크롤링이 "불안정"하다는 것을 알 수 있습니다 (충분히 빠르게 스크롤하면 발생하지 않음). 내 생각 엔 NestedScrollView 자체가 높이가 변하고 예를 들어 위로 스크롤하는 동안 스크롤이 발생하기 때문에 이러한 현상이 발생합니다.

+1

은 종종 '불안해'성능을 이끈다. ViewPager를 사용하여 무엇을 정교하게 만드시겠습니까? 가능한 경우 레이아웃 XML을 공유하십시오 .... –

+1

코디네이터 레이아웃을 살펴보십시오 – Rainmaker

+0

@AbhishekSingh 내 모든보기가 포함 된 github가 있습니다 – CBeTJlu4ok

답변

2

위의 내용은 ConstraintLayoutGuideline의 도움으로 완전히 수행 할 수 있습니다. 따라서 위로 스크롤 할 때 가이드 라인을 프로그래밍 방식으로 최소로 설정하고 아래로 스크롤하면 길드 라인을 정상으로 되돌립니다. 다음은

당신은뿐만 아니라 NestedScrollView 안에 뷰를 배치 할 수 있습니다 동일한

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity"> 


    <android.support.constraint.Guideline 
     android:id="@+id/viewPagerTopGuideline" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     app:layout_constraintGuide_percent="0.1" /> 


    <android.support.constraint.Guideline 
     android:id="@+id/viewPagerBottomGuideline" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     app:layout_constraintGuide_percent="0.5" /> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewPager" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:layout_constraintBottom_toTopOf="@+id/viewPagerBottomGuideline" 
     app:layout_constraintTop_toBottomOf="@+id/viewPagerTopGuideline"> 

    </android.support.v4.view.ViewPager> 

    <android.support.v7.widget.RecyclerView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:layout_constraintTop_toBottomOf="@+id/viewPagerBottomGuideline"/> 

</android.support.constraint.ConstraintLayout> 

위한 XML 샘플입니다. 그런 다음 onscroll 당신은 그냥 스크롤 업에 구현 한이

@BindView(R.id.viewPagerBottomGuideline) 
Guideline guideLine;//have Used ButterKnife 

ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) guideLine.getLayoutParams(); 
      params.guidePercent = 0.20f; // 45% // range: 0 <-> 1 
      guideLine.setLayoutParams(params); 

같은 가이드 라인을 설정할 수 있습니다, 당신은 아래로뿐만 아니라 스크롤에 대해 동일한을 구현해야합니다.

+0

CoordinatorLayout 또는 ConstraintLayout을 사용할 수 없습니다. – CBeTJlu4ok

+0

사용할 수 없지만 올바른 대답은 – CBeTJlu4ok

2

현재 코드에 따르면

YES는이 때문입니다 ...

모든 작동하는 것 같다,하지만 천천히 스크롤 할 때 당신이 알로 스크롤은 "불안해"입니다 메소드 onScrollChange은 사용자가 느리게 스크롤하면 (시스템이 scroll ==> stop ==> scroll ==> stop ==> scroll ==> stop ==>...과 같이 잘못 해석하여) 여러 번 호출 될 수 있으므로 메소드 내부의 논리가 여러 번 실행되거나 계산이 수행되고 lo가 있기 때문에 gic (ifelse) UI의 응답성에 영향을 줄 수 있습니다. 사용자가 빠르게 스크롤하면 한 번 스크롤되며 한 번의 스크롤로 해석됩니다.

해결책 : 가능하면

  1. 코드에서 일부 무심 계산과 논리를 줄입니다.
  2. LinearLayout 대신 루트 레이아웃으로 을 사용하고 ViewsCoordinatorLayout 안에 있어야하는 일부 Behaviours을 설정하십시오. 그렇지 않으면 boolean을 사용하여 로직을 준비합니다. 그러면 onSrollChange 메서드의 내용이 여러 번 호출되지 않지만 사용자가 마지막으로 전체 슬로우 스크롤을 마칠 때 한 번만 호출됩니다.
+0

CoordinatorLayout 또는 ConstraintLayout을 사용할 수 없습니다. 전화 건수는 문제가되지 않습니다. 나는 당신이 내 코드를 검사 할 시간을 보냈다고 생각하지 않는다. – CBeTJlu4ok

+0

나는 당신의 코드를 읽었다! github에도 불구하고 문제는 여러 번 호출되는 방법입니다! 이전 애니메이션이 끝나고 애니메이션의 업데이트가 이전 애니메이션이 끝난 후에 나중에 저장되는 경우에만로드 할 애니메이션을 시도해보십시오. 이것은 사용자에게도 친숙합니다! – Xenolion

+0

은 아이디어처럼 들리며 여기에 현상금을 수여 할 시간이 거의 없으므로 – CBeTJlu4ok

2

기본 레이아웃 (루트 레이아웃)으로 CoOrdinate 레이아웃을 사용하는 것이 좋습니다. then Java 또는 코딩을 통해 툴바를 축소하는 것과 같은 동작을 설정하기 만하면됩니다. 나는 똑같은 것을 구현했고, this 링크가 정말로 나를 많이 도왔다. 링크를 클릭하여 시도해보십시오. RecyclerView 및 NestedScrollView 혼합

(https://github.com/teocci/AndroidGuidenotes/wiki/Handling-Scrolls-with-CoordinatorLayout)

+0

입니다.이 링크는 정말 도움이됩니다 .. –

+0

이 링크는 질문에 대한 답변 일지 모르지만 여기에 중요한 부분을 제공하십시오. –

+0

CoordinatorLayout 또는 ConstraintLayout을 사용할 수 없습니다. – CBeTJlu4ok