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.SimpleOnGestureListener
và Scroller
. 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 đề:
- Tôi có thể cuộn thêm về quá khứ. wn
- 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ặcScrollView
) - 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ó
- 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?
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" –
@AdeelShahzad Chưa. Nếu bạn nghĩ ra một giải pháp thì hãy cho tôi biết. :) –
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. –