13

스크롤링 변경 사항을 실행할 때 AppBarLayout.ScrollingViewBehavior에서 offsetChildAsNeeded 메서드의 수학 흐름을 보았습니다.AppBarLayout.ScrollingViewBehavior의 수학은 어떻게 작동합니까?

개인 방법이며 개인은 mOffsetDelta이므로 프로그래밍 방식으로 모니터링 할 수 있습니까?

(방법이 너무 offset를 사용하는 방법 그것은 분명하지 않다.)

private void offsetChildAsNeeded(CoordinatorLayout parent, View child, View dependency) { 
    final CoordinatorLayout.Behavior behavior = 
       ((CoordinatorLayout.LayoutParams) dependency.getLayoutParams()).getBehavior(); 
    if (behavior instanceof Behavior) { 
     // Offset the child, pinning it to the bottom the header-dependency, maintaining 
     // any vertical gap, and overlap 
     final Behavior ablBehavior = (Behavior) behavior; 
     final int offset = ablBehavior.getTopBottomOffsetForScrollingSibling(); 
     ViewCompat.offsetTopAndBottom(child, (dependency.getBottom() - child.getTop()) 
       + ablBehavior.mOffsetDelta 
       + getVerticalLayoutGap() 
       - getOverlapPixelsForOffset(dependency)); 
     } 
    } 

참고 : 환영하며 (dependency.getBottom() - child.getTop())의, getTopBottomOffsetForScrollingSibling()의 수학의 논리에 대한 자세한 내용을 설명하는 사람을 응답을받을 수 있었다, 및 mOffsetDelta

+0

달성하려는 계획보다는 최종 목표를 설명하는 것이 좋습니다. – natario

+0

마지막 목표는 스크롤을 변경하는 동안 동작이 어떻게 작동하는지 배우는 것입니다. – GPack

+0

'AppBarLayout.ScrollingViewBehavior' 클래스를 프로젝트에 추가하고, 변경하고,'AppBarLayout'의'app : layout_behavior'가 이익이되도록합니다. –

답변

2

의 내용에이 코드를 리버스 엔지니어링 수 있지만, 우리 단순한 인간 (즉 Google 이외의) 프로그래머가 버지니아에 액세스 할 수 없기 때문에 결국은 대학의 lues 및 방법 여기에 표시됩니다. 나는 그들이 실제로 우리가 할 수있는 도서관의 숫자가 일 때, 우리가 제출할 버그 보고서가 적다는 것을 그들이 알고 있다고 생각한다. 한숨.

final int offset = ablBehavior.getTopBottomOffsetForScrollingSibling(); 

offset 실제로 사용되지 않습니다 때문에, 이전 버전의 흔적 남은 것으로 보인다

먼저 그 코드 라인의 :

그러나 여기에는 간단한 설명입니다. 더 새로운 경우에는 좀 더 정확해야합니다.

ViewCompat.offsetTopAndBottom()은 (절대) 연산이 아니라 추가 (상대) 연산입니다. 따라서 일반적인 로직을 가정하고이 동작이 기본적으로 앱 막대 레이아웃 바로 아래에 스크롤 뷰를 배치한다고 생각해 봅시다. 일반적으로 앱 막대의 아래쪽과 스크롤하는보기의 상단은 같은 값을 갖습니다. 앱 바 레이아웃 (의존성)을 변경하고, 스크롤 뷰 (자식)을 (아직)되지 않았기 때문에

dependency.getBottom() - child.getTop() 

아이의 수직 오프셋의 필요가 조정되는 것을 상대적인 양이다.

코드 읽기가 정확하다면 앱 막대 레이아웃의 동작은 오프셋 막대가있는 경우에만 0이 아닙니다. 일반적으로 앱 표시 줄 이 시차로 이동하지 않으므로 걱정되는 모든 경우에 mOffsetDelta은 0입니다. getVerticalLayoutGapgetOverlapPixelsForOffsetoverlapTop과 같은 레이아웃 매개 변수를 처리합니다.

하지만 당신은 단지이 수행하여 자신의 행동의 하위 클래스에서 그 가장자리의 경우없이 대부분의 작업을 수행 할 수 있음을 밝혀 :

@Override 
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, 
              View dependency) { 
     // get the bottom of the app bar layout 
     int bottom = dependency.getBottom(); 

     // position the top of the scrolling view there 
     return setTopAndBottomOffset(bottom); 
    } 

나는 그것이 상대보다는 절대 오프셋 작업을 좀 더 쉽게 찾을 수를 오프셋. 따라서 스크롤 동작을 구현하는 것은 주로 종속 뷰의 위치와 스크롤 뷰를 기반으로해야하는 위치를 결정하는 문제입니다.