我有一个RelativeLayout,用于连接按边距定位的其他布局(视图)。我还有一个检测滚动的GestureDetector,并为RelativeLayout调用scrollBy():
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
int dx = (int) distanceX;
int dy = (int) distanceY;
sdx+= dx; sdy+= dy;
container.scrollBy(dx, dy);
return false;
}
当我滚动它时,我遇到了一个问题:
如果子视图部分位于屏幕外,我会在向右或向下滑动时剪裁。但如果某些视图在第一时间完全不可见,那么它们在显示时看起来很好。问题是什么?也许我需要在容器中添加一些属性(试过android:clipChildren,android:clipToPadding,android:isScrollContainer)?请帮帮我!
由于
答案 0 :(得分:2)
默认情况下,没有适当的机制告诉父级的子视图,他们需要在滚动事件上重绘自己。 SDK中的可滚动窗口小部件以各种特定方式处理它。您最简单的选项可能是将RelativeLayout
容器子类化,以便覆盖onScrollChanged()
并使用此回调来调用invalidate()
。这将告诉容器(以及随后的子容器)在滚动后需要重绘。
在手势回调中调用container.invalidate()
后,您可以直接调用container.scrollBy()
。我不确定这是否会过早地调用invalidate()
;虽然如果您尝试进行任何平滑滚动,此方法也会崩溃。
HTH
答案 1 :(得分:0)
在我的情况下,我在顶层有一个RelativeLayout
(管理自定义PageView类的分页)。此父类宽度和高度设置为MATCH_PARENT
PageView也是RelativeLayout
,并根据自己的ScaleGestureDetector
和GestureDetector
类捕获的动作事件管理自己的大小和滚动位置。它还添加了大量动态视图(EditText,RadioGroup,checkbox,SurfaceView for drawing等)
我发现,当子视图的大小/位置因页面视图的更改而发生更改时,完全存在于屏幕显示区域内部或外部的任何子视图都具有正确的尺寸。穿过屏幕定义的区域的其他人具有正确的位置,但是尺寸(宽度和高度)被裁剪到窗口边界。这与任何RelativeLayout
属性设置无关,或者至少在我看来是这样。
我的案例中的解决方案是将最外面的容器从RelativeLayout
更改为FrameLayout
并将其修复。因此FrameLayout
(用于分页)包含单个可调整大小的RelativeLayout
(对于页面),其中包含表单元素的多个动态组件。