【发布时间】:2016-09-03 14:48:46
【问题描述】:
我刚刚开始(第一次)在 Android 中编写自定义视图,我意识到我需要实现滚动功能。
自定义视图还使用包含一些文本的标题(应该保持固定而不是滚动)。
我已经阅读了有关 GestureDetector.SimpleOnGestureListener 和 Scroller 的文档。我还阅读了 Animating a Scroll Gesture 上的文档,但我发现这些示例很难理解。我还查看了有关 Stack Overflow 的其他问题,这对我有所帮助。
使用我从带有the Stack Overflow answer 的文档中了解的内容作为指导我的参考,我已将以下内容添加到我的自定义视图中:
变量和字段:
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;
}
});
mScroller的初始化:
// Called from the constructor
private void init() {
mScroller = new OverScroller(getContext(), new FastOutLinearInInterpolator());
...
}
onDraw():
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
...
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
}
}
onTouchEvent():
@Override
public boolean onTouchEvent(MotionEvent event) {
return mGestureDetector.onTouchEvent(event);
}
这些添加的结果是一个可以垂直(而不是水平)滚动的自定义视图,但是有一些问题:
- 我可以滚动超过所绘制的内容
- 当我到达自定义视图的末尾时,没有边缘发光效果(我的意思是像
RecyclerView或ScrollView) - 所有自定义视图都会滚动,而不仅仅是其中的一部分
- 我不完全明白发生了什么
有人能解释一下滚动在自定义视图中的工作原理以及如何使用这些功能正确实现它吗?
【问题讨论】:
-
你好,法博德·萨拉马特-扎德。你有没有找到任何解决方案?我也遇到了同样的问题,即; “我可以滚动到更远的地方”
-
@AdeelShahzad 还没有。如果您想出解决方案,请告诉我。 :)
-
嗨,法博德。我想不出一个解决方案,所以我只是在 ViewPager 中扔了一个 ScrollView。
标签: android android-custom-view gesturedetector