2016-09-03 26 views
8

Tôi vừa mới bắt đầu viết chế độ xem tùy chỉnh trong Android (lần đầu tiên) và tôi đã nhận ra rằng tôi cần triển khai tính năng cuộn.Cách thêm cuộn cho chế độ xem tùy chỉnh trong Android

Chế độ xem tùy chỉnh cũng sử dụng tiêu đề chứa một số văn bản (nên giữ cố định và không cuộn).

Tôi đã đọc qua tài liệu trên GestureDetector.SimpleOnGestureListenerScroller. Tôi cũng đọc tài liệu trên Animating a Scroll Gesture nhưng tôi thấy các ví dụ khó hiểu. Tôi cũng đã xem xét các câu hỏi khác trên Stack Overflow đã giúp một chút.

Sử dụng những gì tôi hiểu từ các tài liệu với the Stack Overflow answer như một tài liệu tham khảo để hướng dẫn cho tôi, tôi đã thêm phần sau đây để xem tùy chỉnh của tôi:

biến và các lĩnh vực:

private OverScroller mScroller; 
private final GestureDetector mGestureDetector = 
     new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() { 

      @Override 
      public boolean onScroll(MotionEvent e1, MotionEvent e2, 
            float distanceX, float distanceY) { 
       // Note 0 as the x-distance to prevent horizontal scrolling 
       scrollBy(0, (int) distanceY); 
       return true; 
      } 

      @Override 
      public boolean onFling(MotionEvent e1, MotionEvent e2, 
            float velocityX, float velocityY) { 
       final int maxScrollX = 0; 

       // wholeViewHeight is height of everything that is drawn 
       int wholeViewHeight = calculateWholeHeight(); 
       int visibleHeight = getHeight(); 
       final int maxScrollY = wholeViewHeight - visibleHeight; 

       mScroller.forceFinished(true); 

       mScroller.fling(0, // No startX as there is no horizontal scrolling 
         getScrollY(), 
         0, // No velocityX as there is no horizontal scrolling 
         - (int) velocityY, 
         0, 
         maxScrollX, 
         0, 
         maxScrollY); 

       invalidate(); 

       return true; 
      } 

      @Override 
      public boolean onDown(MotionEvent e) { 
       if (!mScroller.isFinished()) { 
        mScroller.forceFinished(true); 
       } 
       return true; 
      } 
     }); 

khởi của mScroller:

// Called from the constructor 
private void init() { 
    mScroller = new OverScroller(getContext(), new FastOutLinearInInterpolator()); 

    ... 
} 

Stuff trong onDraw():

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 

    ... 

    if (mScroller.computeScrollOffset()) { 
     scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); 
    } 
} 

Stuff trong onTouchEvent():

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    return mGestureDetector.onTouchEvent(event); 
} 

Kết quả của những bổ sung là một giao diện tùy chỉnh mà có thể cuộn theo chiều dọc (và không phải theo chiều ngang), tuy nhiên có một một vài vấn đề:

  1. Tôi có thể cuộn thêm về quá khứ. wn
  2. Không có hiệu lực cạnh ánh sáng rực rỡ như tôi đến cuối của giao diện tùy chỉnh (Ý tôi là giống như một RecyclerView hoặc ScrollView)
  3. Tất cả các cuộn giao diện tùy chỉnh như trái ngược với chỉ một phần nhất định của nó
  4. tôi không hiểu đầy đủ về những gì đang xảy ra

Ai đó có thể giải thích cách cuộn hoạt động trong chế độ xem tùy chỉnh và cách triển khai chế độ xem phù hợp với các tính năng này?

+0

Xin chào, Farbod Salamat-Zadeh. Bạn đã tìm thấy bất kỳ giải pháp cho điều này? Tôi cũng bị mắc kẹt trên cùng một vấn đề i.e; "Tôi có thể cuộn xa hơn những gì được rút ra" –

+0

@AdeelShahzad Chưa. Nếu bạn nghĩ ra một giải pháp thì hãy cho tôi biết. :) –

+0

Xin chào, Farbod. Tôi không thể đưa ra một giải pháp vì vậy tôi chỉ ném một ScrollView bên trong một ViewPager. –

Trả lời

4

Tôi có thể cung cấp bố cục đơn giản có tiêu đề cố định và nội dung cuộn dọc có vẻ như sẽ làm những gì bạn muốn và không yêu cầu lập trình phức tạp? Nó có thể giúp bạn tiết kiệm từ việc phải bỏ ra hàng giờ nghiên cứu và lập trình trong thời gian dài:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <FrameLayout 
     android:id="@+id/header" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"/> 

    <android.support.v4.widget.NestedScrollView 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:fillViewport="true"> 

     <FrameLayout 
      android:id="@+id/scrolling_content" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"/> 
    </android.support.v4.widget.NestedScrollView> 

</LinearLayout> 

Sử dụng bố trí này, bạn sẽ thay thế hoặc chèn bên trong FrameLayout với ID "tiêu đề" với quan điểm tiêu đề cố định của bạn. Sau đó, bạn sẽ đặt nội dung lừa đảo của mình vào bên trong của FrameLayout với ID "scrolling_content". NestedScrollingView sẽ được đặt ngay bên dưới tiêu đề cố định của bạn và tự động cung cấp cho bạn hành vi cuộn mà bạn muốn mà không cần thêm bất kỳ mã nào.

+0

Cảm ơn câu trả lời của bạn. Tôi có thể thay thế 'FrameLayout' thứ hai bằng một phần của chế độ xem tùy chỉnh của mình để cho phép nó cuộn không? –

+0

Có, nhưng hãy nhớ NestedScrollView chỉ có thể có một con trực tiếp. Miễn là bạn không cố gắng đặt 2 lượt xem trực tiếp vào NestedScrollView, nó sẽ hoạt động tốt. Cũng nên nhớ rằng bất kỳ khung nhìn nào bên trong một NestedScrollView cuộn theo chiều dọc không thể có layout_height của "match_parent", như thể giá trị này được vinh danh nó sẽ tạo ra một cuộn dài vô hạn. – happydude

+0

Cảm ơn bạn đã làm rõ. Tôi sẽ thử sử dụng 'NestedScrollView' và xem nó hoạt động như thế nào đối với tôi. Tuy nhiên, tôi vẫn muốn biết làm thế nào nó có thể được thực hiện (bằng cách sử dụng 'GestureDetector',' OverScroller', vv) cho một View tùy chỉnh. Tôi đã bắt đầu một tiền thưởng cho điều này, vì vậy nếu bạn có một câu trả lời thay thế, hãy đăng nó. :) –

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