2015-09-19 38 views
12

sử dụng ví dụ cơ bản nhất với AppBarLayout và Thanh công cụ, tôi không thể nhìn thấy hoạt ảnh quá mức (ánh sáng từ dưới cùng cũng như trên) khi cố gắng cuộn nhiều hơn. Tuy nhiên, nếu bạn ném nội dung, nó sẽ hiển thị nó.Lollipop AppBarLayout/Thanh công cụ thiếu hoạt ảnh overscroll

Đây là mã (nav_drawer_toolbar_layout.xml):

<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <!-- Replace fragments in this content frame, like a RecycleView --> 
    <FrameLayout 
     android:id="@+id/content_frame" 
     app:layout_behavior="android.support.design.widget.AppBarLayout$ScrollingViewBehavior" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 
     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:minHeight="?attr/actionBarSize" 
      app:titleTextAppearance="@style/Base.TextAppearance.AppCompat.Title" 
      app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
      app:layout_scrollFlags="scroll|enterAlways"/> 
    </android.support.design.widget.AppBarLayout> 

</android.support.design.widget.CoordinatorLayout> 

Tiếp theo là lớp Hoạt động đơn giản:

public class MyActivity extends AppCompatActivity implements { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.nav_drawer_toolbar_layout); 

     // Setup the toolbar/actionbar 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     FragmentManager manager = getFragmentManager(); 
     manager.beginTransaction().replace(R.id.content_frame, new MyFragmentList).commit(); 
    } 
} 

MyFragmentList là một mảnh với một RecycleView với nội dung để di chuyển các ứng dụng.

Tuy nhiên nếu tôi xóa AppBarLayout khỏi xml và để Thanh công cụ mở (chỉ cần bình luận Mở và đóng AppBarLayout), nó sẽ hiển thị hoạt ảnh ghi đè (ánh sáng) khi cuộn.

Hoặc nếu bạn xóa layout_scrollFlags="scroll" thì công việc ghi đè quá mức nhưng bạn không thể lấy thanh tác vụ để ẩn khi bạn cuộn.

Để biết thông tin thêm, gỡ lỗi RecycleView, dòng 2272

if(this.mBottomGlow != null && !this.mBottomGlow.isFinished()) { 

luôn hoàn thành khi bao gồm AppBarLayout và chưa kết thúc khi nó không phải là ở đó. Có gì đó đang ghi đè các sự kiện liên lạc của nó không?

Có ai biết ai thể hiện hoạt ảnh ghi đè (ánh sáng) với AppBarLayout không?

+0

Hi @ user654628 bạn có bất kỳ cập nhật nào về điều này không? Tôi đang gặp vấn đề tương tự như bạn hiện tại: / – CodingBird

Trả lời

3

EDIT: Dường như có một ticket cho lỗi này. Bạn có thể chắc chắn làm những gì artur.dr ... @ gmail.com đã làm và mở rộng RecyclerView để ghi đè RecyclerView # dispatchNestedScroll để luôn trả về false (anh viết đúng trong báo cáo của mình), bạn có thể nhận được hoạt ảnh ghi đè hoạt động, mặc dù tôi khá chắc chắn có thể phá vỡ một cái gì đó xuống dòng.

Thật không may làm thế nào RecyclerView được mã hóa và cách NestedScrollingChild API được tạo ra không có cách nào sạch sẽ để có hành vi mong muốn.

Đây là từ RecyclerView (23.1.1, tuy nhiên tôi không tin bất kỳ phiên bản nào trước khi khắc phục sự cố) bên trong phương thức scrollByInternal.

if (dispatchNestedScroll(consumedX, consumedY, unconsumedX, unconsumedY, mScrollOffset)) { 
    // Update the last touch co-ords, taking any scroll offset into account 
    mLastTouchX -= mScrollOffset[0]; 
    mLastTouchY -= mScrollOffset[1]; 
    if (ev != null) { 
     ev.offsetLocation(mScrollOffset[0], mScrollOffset[1]); 
    } 
    mNestedOffsets[0] += mScrollOffset[0]; 
    mNestedOffsets[1] += mScrollOffset[1]; 
} else if (ViewCompat.getOverScrollMode(this) != ViewCompat.OVER_SCROLL_NEVER) { 
    if (ev != null) { 
     pullGlows(ev.getX(), unconsumedX, ev.getY(), unconsumedY); 
    } 
    considerReleasingGlowsOnScroll(x, y); 
} 

Như chúng ta có thể thấy ở đây trên javadoc cho dispatchNestedScroll (một phần của API NestedScrollingChild) miễn là có một mẹ mà tiêu thụ cuộn, RecyclerView sẽ không áp dụng bất kỳ hình ảnh động thanh cuộn (cạnh ánh sáng).

AppBarLayout không tiêu thụ cuộn, cụ thể hơn miễn là có NestedScrollingParent trả về true trên onStartNestedScroll, hoạt ảnh ghi đè sẽ không xảy ra.

Điều phối viênLay hết là NestedScrollingParent nhưng không trả về true trừ khi có một CoordinatorLayout.Behavior thực hiện điều đó. Hành vi mặc định của AppBarLayout không thực hiện lệnh methdo này để trả về true khi có cuộn dọc + AppBarLayout có thứ gì đó để cuộn + chế độ xem đủ lớn để cuộn.

// Return true if we're nested scrolling vertically, and we have scrollable children 
// and the scrolling view is big enough to scroll 
final boolean started = (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0 
      && child.hasScrollableChildren() 
      && parent.getHeight() - directTargetChild.getHeight() <= child.getHeight(); 

Phơi sáng có cách tiếp cận hơi khác, cho phép NestedScrollingParent tiêu thụ cuộn.

if (!dispatchNestedPreFling(velocityX, velocityY)) { 
    final boolean canScroll = canScrollHorizontal || canScrollVertical; 
    dispatchNestedFling(velocityX, velocityY, canScroll); 

    if (canScroll) { 
     velocityX = Math.max(-mMaxFlingVelocity, Math.min(velocityX, mMaxFlingVelocity)); 
     velocityY = Math.max(-mMaxFlingVelocity, Math.min(velocityY, mMaxFlingVelocity)); 
     mViewFlinger.fling(velocityX, velocityY); 
     return true; 
    } 
} 

Thành thật mà nói, tôi không thể biết đây có phải là lỗi hay không vì cả logic đều hợp lý. Nếu bạn đang di chuyển đến phần trên cùng của khung nhìn, và bạn có một cái gì đó giống như một CollapsingToolbar, bạn sẽ không muốn một hình ảnh động overscoll xảy ra. Tuy nhiên có một cách để làm cho nó để các hành vi có thể tiêu thụ số lượng x/y di chuyển để ngăn chặn các hình ảnh động xảy ra. Nó cũng là lạ rằng cả hai mã cho di chuyển và flinging là khác nhau.

Các vấn đề liên quan